将非零索引作为数组查找

时间:2017-08-09 20:33:28

标签: python numpy

我知道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的片段,减少一个维度而不是一个元组并尝试重新生成丢失的行会容易得多。

2 个答案:

答案 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])