假设我有以下形式的numpy数组:
arr=numpy.array([[1,1,0],[1,1,0],[0,0,1],[0,0,0]])
我想找到第一个索引(对于每一列)的索引,其中值非零。
因此,在这种情况下,我希望返回以下内容:
[0,0,2]
我该怎么办?
np.argmax
沿轴(零轴这里列)非零的面具拿到第一的指标matches
(真实值)(arr!=0).argmax(axis=0)
扩展到涵盖通用轴说明符,并且在沿着该轴找不到元素的非零的情况下,我们将有一个类似的实现-
def first_nonzero(arr, axis, invalid_val=-1):
mask = arr!=0
return np.where(mask.any(axis=axis), mask.argmax(axis=axis), invalid_val)
请注意,由于argmax()
所有False
值都会返回0
,因此如果invalid_val
需要的话0
,我们将直接使用生成最终输出mask.argmax(axis=axis)
。
样品运行-
In [296]: arr # Different from given sample for variety
Out[296]:
array([[1, 0, 0],
[1, 1, 0],
[0, 1, 0],
[0, 0, 0]])
In [297]: first_nonzero(arr, axis=0, invalid_val=-1)
Out[297]: array([ 0, 1, -1])
In [298]: first_nonzero(arr, axis=1, invalid_val=-1)
Out[298]: array([ 0, 0, 1, -1])
扩展到涵盖所有比较操作
为了找到第一zeros
,简单地使用arr==0
作为mask
在功能使用。对于等于某个特定值的第一个val
,arr == val
在comparisons
此处对所有可能的情况使用等等。
要找到符合特定比较标准的最后一个,我们需要沿该轴翻转,并使用相同的用法argmax
,然后通过偏离轴长来补偿该翻转,如下所示-
def last_nonzero(arr, axis, invalid_val=-1):
mask = arr!=0
val = arr.shape[axis] - np.flip(mask, axis=axis).argmax(axis=axis) - 1
return np.where(mask.any(axis=axis), val, invalid_val)
样品运行-
In [320]: arr
Out[320]:
array([[1, 0, 0],
[1, 1, 0],
[0, 1, 0],
[0, 0, 0]])
In [321]: last_nonzero(arr, axis=0, invalid_val=-1)
Out[321]: array([ 1, 2, -1])
In [322]: last_nonzero(arr, axis=1, invalid_val=-1)
Out[322]: array([ 0, 1, 1, -1])
同样,comparisons
这里所有可能的情况都通过使用相应的比较器进行获取mask
,然后在列出的函数中使用来覆盖。
假设我有一个如下形式的numpy数组: 我想找到第一个索引的索引(对于每一列),其中的值是非零的。 因此,在本例中,我希望返回以下内容: 我该怎么办?
问题内容: 我有以下数组 我想找到连续为零的数组的开始和结束索引,输出上方的数组如下所示 我想做得尽可能高效。 问题答案: 这是一个相当紧凑的矢量化实现。我已经更改了一些要求,所以返回值有点“ numpythonic”:它创建一个形状为(m,2)的数组,其中m是零的“游程”数。第一列是每次运行中前0个的索引,第二列是运行后第一个非零元素的索引。(例如,此索引模式匹配切片的工作方式以及函数的工作方式
问题内容: 假设我们有一个1d的numpy数组,其中填充了一些值。假设其中一些是。 有什么方法可以利用数组的功能,用找到的最后一个非零值填充所有值? 例如: 一种方法是使用以下功能: 但是,这是使用原始的python循环,而不是利用and功能。 如果我们知道可能有相当数量的连续零,则可以使用基于的东西。问题在于连续零的数量可能很大… 有任何想法吗?还是我们应该直接去? 免责声明: 我会说很久以前,
问题内容: 我想创建一个numpy数组,其中每个元素必须是一个列表,因此以后我可以向每个元素追加新元素。 我已经看过谷歌,这里已经有堆栈溢出,但是似乎找不到地方。 主要问题是numpy假定您的列表必须成为数组,但这不是我要的。 问题答案: 如您所见,在给出类似以下内容时,尝试创建2d数组 您已应用了一些技巧来解决此默认行为。 一种是使子列表的长度可变。它不能从这些数组中生成2d数组,因此它求助于对
问题内容: 我有两个一维数组x和y,一个比另一个小。我试图找到x中y的每个元素的索引。 我发现有两种简单的方法可以做到这一点,第一种很慢,第二种需要占用大量内存。 记忆猪 是否有更快的方法或更少的内存密集型方法?理想情况下,搜索将利用以下事实:我们不是在列表中搜索一件事,而是在搜索许多东西,因此稍微适合并行化。如果您不假设y的每个元素实际上都在x中,则可获得加分。 问题答案: 正如Joe King
我需要找到高于指定阈值的的第一个和最后一个元素。我找到了以下解决方案,这是有效的,但它看起来有点令人费解。有没有更简单/更蟒蛇的方式?