numpy 查找条件为真的最后一个列号

lo8azlld  于 2023-08-05  发布在  其他
关注(0)|答案(5)|浏览(122)

我有下面的2D数组,其中1总是在左边:

arr = np.array([
    [1, 1, 1, 0],
    [1, 0, 0, 0],
    [1, 1, 0, 0],
    [1, 1, 1, 1],
    [1, 0, 0, 0]
])

字符串
如何找到每行中最近出现的1的索引?
我的预期结果是:

array([2, 0, 1, 3, 0])

qjp7pelc

qjp7pelc1#

如果你总是在每一行都有一个1,在反向数组上使用numpy.argmax

# if only 0/1
out = arr.shape[1] - np.argmax(arr[:, ::-1], axis=1) -1

# else
out = arr.shape[1] - np.argmax(arr[:, ::-1] == 1, axis=1) -1

字符串
输出:array([2, 0, 1, 3, 0])
如果您可以有没有1的行:

arr = np.array([
    [1, 1, 1, 0],
    [1, 0, 0, 0],
    [1, 1, 0, 0],
    [1, 1, 1, 1],
    [1, 0, 0, 0],
    [0, 0, 0, 0]
])

m = arr[:, ::-1] == 1
out = arr.shape[1] - np.argmax(arr[:, ::-1], axis=1) -1

out = np.where(m.any(1), out, np.nan)


输出:array([ 2., 0., 1., 3., 0., nan])

8zzbczxx

8zzbczxx2#

有了2个循环,你就可以实现你所需要的……

result = []

for row in arr:
    last = -1  # if there is no 1
    for i in range(len(row)):
        if row[i] == 1:
            last = i
    
    result.append(last)

字符串
结果将是一个列表,但您可以将结果类型更改为您喜欢的任何类型,例如NumPy数组等

xtupzzrd

xtupzzrd3#

你可以通过以下方式得到所有存在1的索引:

k = np.where(arr == 1)

(array([0, 0, 0, 1, 2, 2, 3, 3, 3, 3, 4], dtype=int64),  #This gives the row number 
 array([0, 1, 2, 0, 0, 1, 0, 1, 2, 3, 0], dtype=int64))  #This gives the index

字符串
要查找每行中最新出现的1,请执行以下操作:

[k[1][x] for x in range(len(k[0])-1) if k[0][x]!= k[0][x+1]]

#output

[2, 0, 1, 3]

xesrikrc

xesrikrc4#

你可以使用numpy.apply_along_axis来处理一行代码。我认为使用np.max()和np.where()也非常直观。

arr = np.array([
    [1, 1, 1, 0],
    [1, 0, 0, 0],
    [1, 1, 0, 0],
    [1, 1, 1, 1],
    [1, 0, 0, 0]
])

indices = np.apply_along_axis(lambda row: np.max(np.where(row == 1)),axis=1,arr=arr)

print(indices)

字符串
测试结果:

[2 0 1 2 3 0]


您也可以反转数组并使用np.min,然后检查它们是否匹配,以确定是否有任何像[1,1,0,1]这样的情况。请查看numpy文档,因为他们有很多使用这些函数的例子。

u0njafvf

u0njafvf5#

我们可以使用cumsumargmax

np.argmax(np.cumsum(arr, axis=1), axis=1)

字符串
输出:

array([2, 0, 1, 3, 0])

相关问题