我知道numpy.where给出条件适用的数组坐标的元组。但是,如果我想要一个阵列怎么办? 假设以下2d数组:
a=np.array([[1 1 1 1 0],
[1 1 1 0 0],
[1 0 0 0 0],
[1 0 1 1 1],
[1 0 0 1 0]])
现在我想要的只是第一次出现的零,但对于每一行,即使它不存在。类似于Java中的indexOf()
。所以输出看起来像:
array([-1,2,2,1,0])
我需要剪切一个ndarray的片段,减少一个维度而不是一个元组并尝试重新生成丢失的行会容易得多。
答案 0 :(得分:5)
this您要找的是什么?
import numpy as np
a=np.array([[1, 1, 1, 1, 0],
[1, 1, 1, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 1, 1, 1],
[1, 0, 0, 1, 0]])
np.argmax(a==0, axis=0) - ~np.any(a==0, axis=0)
输出:
array([-1, 2, 2, 1, 0], dtype=int64)
这里的想法是np.argmax
找到每列中第一个匹配元素的索引({em>列的axis=0
,这似乎是你想要的输出,但如果你真的想要行,请使用axis=1
)。因为np.argmax
对于完全不匹配的列返回0,所以我从每个不包含任何0的列的结果中减去1。
答案 1 :(得分:0)
这是一个不那么狡猾的解决方案,但可以说更容易解决。 首先找到所有匹配,然后创建一个带有匹配的第一个元素的数组,如果len == 0,则创建-1。
a=np.array([[1,1,1,1,0],
[1,1,1,0,0],
[1,0,0,0,0],
[1,0,1,1,1],
[1,0,0,1,0]])
matches = [np.where(np.array(i)==0)[0] for i in a.T]
np.array([i[0] if len(i) else -1 for i in matches]) # first occurence, else -1
array([-1, 2, 2, 1, 0])