Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Numpy获取与行中最近的前一个有限数的距离

如何使用Numpy获取与行中最近的前一个有限数的距离
EN

Stack Overflow用户
提问于 2017-05-04 01:05:31
回答 2查看 222关注 0票数 2

我被困在了一些我认为可以用Numpy很容易解决的问题上,我就是没看到。让我们定义一个包含一些缺失值的示例数组:

代码语言:javascript
运行
AI代码解释
复制
import numpy as np
input_data = np.array([[1,3,5,8,6],[3,np.nan,np.nan,5,6],[np.nan,6,7,np.nan,2]])

Out[530]: [[1, 3, 5, 8, 6], [3, nan, nan, 5, 6], [nan, 6, 7, nan, 2]]

我要寻找的是获得一个数组,它为每个元素提供到每一行中前一个有效值的距离。在上面的例子中,这可能是这样的:

代码语言:javascript
运行
AI代码解释
复制
delta_valid = [[nan, 1, 1, 1, 1], [nan, 1, 2, 3, 1], [nan, nan, 1, 1, 2]]

每行中的第一个元素总是NaN,因为没有以前的值(不确定是否有更好的方法来定义这个值)。

谁能帮我在Numpy上得到这个结果?非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-04 03:19:04

您基本上是在(1,2,3,...)的范围内,直到下一个non-NaN。为了解决这种情况,我们可以在每一行上使用一些diff + cumsum魔术,如下所示-

代码语言:javascript
运行
AI代码解释
复制
def closest_distance_per_row(a):
    m0 = np.ones(a.shape,dtype=int)
    mask = ~np.isnan(a)
    for i,item in enumerate(a):
        idx = np.flatnonzero(mask[i])
        if len(idx)>0:
            m0[i,:idx[0]] = 0
            m0[i,idx[1:]] = idx[:-1] - idx[1:] +1

    out = np.full(a.shape,np.nan,dtype=float)
    out[:,1:] = m0[:,:-1].cumsum(1)
    out[out==0] = np.nan
    out[~mask.any(1)] = np.nan
    return out

样本运行-

代码语言:javascript
运行
AI代码解释
复制
In [353]: a
Out[353]: 
array([[  1.,   3.,   5.,   8.,   6.],
       [  3.,  nan,  nan,   5.,   6.],
       [ nan,   6.,   7.,  nan,   2.]])

In [354]: closest_distance_per_row(a)
Out[354]: 
array([[ nan,   1.,   1.,   1.,   1.],
       [ nan,   1.,   2.,   3.,   1.],
       [ nan,  nan,   1.,   1.,   2.]])

In [343]: a
Out[343]: 
array([[ nan,  nan,  nan,  nan,  nan,  nan,   4.,  nan,   3.,   1.],
       [ nan,  nan,   6.,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
       [  0.,  nan,   2.,  nan,   1.,  nan,   0.,  nan,  nan,  nan],
       [  3.,  nan,   2.,  nan,   8.,   6.,  nan,   4.,   2.,  nan],
       [ nan,   0.,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
       [ nan,  nan,   2.,  nan,   0.,  nan,  nan,   1.,  nan,  nan]])

In [344]: closest_distance_per_row(a)
Out[344]: 
array([[ nan,  nan,  nan,  nan,  nan,  nan,  nan,   1.,   2.,   1.],
       [ nan,  nan,  nan,   1.,   2.,   3.,   4.,   5.,   6.,   7.],
       [ nan,   1.,   2.,   1.,   2.,   1.,   2.,   1.,   2.,   3.],
       [ nan,   1.,   2.,   1.,   2.,   1.,   1.,   2.,   1.,   1.],
       [ nan,  nan,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.],
       [ nan,  nan,  nan,   1.,   2.,   1.,   2.,   3.,   1.,   2.]])

运行时测试-

代码语言:javascript
运行
AI代码解释
复制
In [4]: a = np.random.randint(0,9,(5000,5000)).astype(float)

In [5]: a.ravel()[np.random.choice(a.size, int(a.size*0.5), replace=0)] = np.nan

In [6]: %timeit two_loops(a)
1 loops, best of 3: 16.7 s per loop

In [7]: %timeit closest_distance_per_row(a)
1 loops, best of 3: 339 ms per loop

In [8]: 16700/339.0 # Speedup with one loop (proposed in this post) over two loops
Out[8]: 49.26253687315634
票数 1
EN

Stack Overflow用户

发布于 2017-05-04 01:28:35

这是一个解决你的问题的方法。这可能不是最理想的,因为我也许可以用地图和/或列表理解做一些更花哨的事情,但至少它解决了您眼前的问题:

代码语言:javascript
运行
AI代码解释
复制
import numpy as np
input_data = np.array([[1,3,5,8,6],[3,np.nan,np.nan,5,6],[np.nan,6,7,np.nan,2]])

def distance(vector):
    dist = np.nan
    dists = []
    for a in vector:
        dists.append(dist)
        dist = dist + 1 if np.isnan(a) else 1
    return np.array(dists)

dists = np.empty(input_data.shape)
for row_num, row in enumerate(input_data):
    dists[row_num, :] = distance(row)

它目前也只适用于2d数组,但它可能很容易被泛化。

另外,上面的代码也不是很优化。为了与接受的答案进行更公平的比较,下面是一个更优化的版本,没有额外的函数调用,也没有列表构建:

代码语言:javascript
运行
AI代码解释
复制
def two_loops(input_data):
    dists = np.empty(input_data.shape)
    for row_num, row in enumerate(input_data):
        dist = np.nan
        for col_num, value in enumerate(row):
            dists[row_num, col_num] = dist
            dist = dist + 1 if np.isnan(value) else 1
    return dists

这使得执行时间更加相似。当我测量时,我的解决方案要花费大约两倍的时间来执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43778450

复制
相关文章
如何在 10 亿数中找出前 1000 大的数
小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。
五分钟学算法
2019/09/03
6380
如何在 10 亿数中找出前 1000 大的数
【面试必备】如何在10亿数中找出前1000大的数?
小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。
Java后端技术
2018/11/07
8540
【面试现场】如何在10亿数中找出前1000大的数
小史:我可以用分治法,这有点类似快排中partition的操作。随机选一个数t,然后对整个数组进行partition,会得到两部分,前一部分的数都大于t,后一部分的数都小于t。
用户1260737
2019/10/14
4210
【面试现场】如何在10亿数中找出前1000大的数
JavaScript获取当前月份的前12个月,获取最近的12个月
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说JavaScript获取当前月份的前12个月,获取最近的12个月,希望能够帮助大家进步!!!
Java架构师必看
2022/07/25
2.5K0
【BAT面试必会】如何在10亿数中找出前1000大的数
小史:我可以用分治法,这有点类似快排中partition的操作。随机选一个数t,然后对整个数组进行partition,会得到两部分,前一部分的数都大于t,后一部分的数都小于t。
乔戈里
2019/02/26
5580
Mysql如何随机获取表中的数呢rand()
随机获取数据的业务场景,想必大家都有遇到过,今天我们分析一下如何正确的显示随机消息.
小土豆Yuki
2020/11/03
4.8K0
[LeetCode Weekly Contest 88]849. 到最近的人的最大距离
第二道题目相对来说比较简单。 题目描述 849. 到最近的人的最大距离 在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的。 至少有一个空座位,且至少有一人坐在座位上。 亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。 返回他到离他最近的人的最大距离。 示例 1: 输入:[1,0,0,0,1,0,1] 输出:2 解释: 如果亚历克斯坐在第二个空位(seats[2])上,他到离他最近的人的距离为 2 。 如果亚历克斯坐在其它任何一个空位上,他到离他最近的人的距离
杜逸先
2018/06/10
1.4K0
迷宫最近距离
广搜代码如下: import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { public static final int[][] maze = new int[][] { {0,1,0,0,0,1,1,1,0,1,0,1}, {0,0,0,1,0,0,0,0,1,0,0,1}, {0,1,0,1,0,1,1,1,0,1,0,0}, {0,1
砖业洋__
2023/05/06
1250
迷宫最近距离
Numpy中的索引与排序
花哨的索引探索花哨的索引组合索引Example:选择随机点利用花哨索引修改值数组排序Numpy中的快速排序:np.sort,np.argsort部分排序:分割
用户3577892
2020/06/12
2.5K0
Numpy中的索引与排序
numpy 计算路线距离
[1]enumerate遍历数组: https://blog.csdn.net/u013555719/article/details/83578489
演化计算与人工智能
2020/08/14
7180
[记录] 数据库中,根据经纬度,查询距离最近的地点
其中 lat 为 维度 ,lon 为 经度 , + 1 加一个经度或者维度,1经度大概等于 111 千米。 这句 sql 查询 该经纬度 111 km 范围内的地点
Alone88
2020/09/28
2.3K0
[记录] 数据库中,根据经纬度,查询距离最近的地点
前m大的数
前m大的数 #include<bits/stdc++.h> int a[3005],b[5000000]; bool cmp(int a,int b) { return a>b;//从大到小进行排序 } using namespace std; int main() { int n,m; while(cin>>n>>m&&n&&m) { int i,j,k=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b));//作用是在一段内存块中填充某个给定
杨鹏伟
2022/05/05
1560
LeetCode 0849. 到最近的人的最大距离
给你一个数组 seats 表示一排座位,其中 seatsi = 1 代表有人坐在第 i 个座位上,seatsi = 0 代表座位 i 上是空的(下标从 0 开始)。
Yano_nankai
2021/02/23
5460
leetcode-849-到最近的人的最大距离
题目描述: 在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的。 至少有一个空座位,且至少有一人坐在座位上。 亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。 返回他到离他最近的人的最大距离。 示例 1: 输入:[1,0,0,0,1,0,1] 输出:2 解释: 如果亚历克斯坐在第二个空位(seats[2])上,他到离他最近的人的距离为 2 。 如果亚历克斯坐在其它任何一个空位上,他到离他最近的人的距离为 1 。 因此,他到离他最近的人的最大距离是 2 。 示
chenjx85
2018/07/05
9760
SQL根据经纬度查询最近的距离
高大北
2023/08/09
4270
LeetCode 849. 到最近的人的最大距离
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximize-distance-to-closest-person 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2020/07/13
6930
LeetCode 849. 到最近的人的最大距离
Python常用numpy与random随机数的产生
还有一种功能相同的方式是: np.random.rand(d1,d2,d3,...,dn)
SL_World
2021/09/18
1.2K0
Python常用numpy与random随机数的产生
产生1个n~m之间的float型随机数: random.uniform(n, m)
用户7886150
2021/01/07
9170
点击加载更多

相似问题

与有限线之间的最近距离

11

最近的行与前几行中的列

13

使用jQuery获取与类最近的前一个元素

31

使用欧几里得距离在numpy数组列表中查找numpy数组的最近邻

324

获取与满足条件的组中最近的前一行的差异

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档