Numpy:沿任意维度查找非零值

Numpy: finding nonzero values along arbitrary dimension

看来我无法在 Numpy 中解决这个问题:我有一个矩阵,具有任意维数,以任意方式排序。在这个矩阵内部,总有一个我感兴趣的维度(正如我所说,这个维度的位置并不总是相同的)。现在,我想沿着这个维度找到第一个非零值。事实上,我需要那个值的索引来对值本身执行一些操作。 举个例子:如果我的矩阵 an x m x p 并且我感兴趣的维度是数字 1,我会做类似的事情:

for ii in xrange(a.shape[0]):
   for kk in xrange(a.shape[2]):
      myview = np.squeeze(a[ii, :, kk])
      firsti = np.nonzero(myview)[0][0]
      myview[firsti] = dostuff

除了性能方面的考虑,我真的不知道如何做到这一点具有不同数量的维度,并且具有我对任意位置感兴趣的维度。

您可以为了自己的目的滥用 np.argmax。在这里,您可以指定您感兴趣的 axis,其中 0 沿列,1 沿行,依此类推。您只需要一个数组,其中包含所有非零元素的相同值。您可以通过执行 a != 0 来实现,因为这将包含所有零元素的 False(意思是 0)和所有零元素的 True(意思是 1)非零元素。现在 np.argmax(a != 0, axis=1) 将为您提供沿 1 轴的第一个非零元素。

例如:

import numpy as np

a = np.array([[0, 1, 4],[1, 0, 2],[0, 0, 1]])
# a = [[0, 1, 4],
#      [1, 0, 2],
#      [0, 0, 1]]

print(np.argmax(a!=0, axis=0))
# >>> array([1, 0, 0]) -> along columns

print(np.argmax(a!=0, axis=1))
# >>> array([1, 0, 2]) -> along rows

这也适用于更高维度,但输出的指导性较差,难以想象。