Numpy:沿任意维度查找非零值
Numpy: finding nonzero values along arbitrary dimension
看来我无法在 Numpy 中解决这个问题:我有一个矩阵,具有任意维数,以任意方式排序。在这个矩阵内部,总有一个我感兴趣的维度(正如我所说,这个维度的位置并不总是相同的)。现在,我想沿着这个维度找到第一个非零值。事实上,我需要那个值的索引来对值本身执行一些操作。
举个例子:如果我的矩阵 a
是 n 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
这也适用于更高维度,但输出的指导性较差,难以想象。
看来我无法在 Numpy 中解决这个问题:我有一个矩阵,具有任意维数,以任意方式排序。在这个矩阵内部,总有一个我感兴趣的维度(正如我所说,这个维度的位置并不总是相同的)。现在,我想沿着这个维度找到第一个非零值。事实上,我需要那个值的索引来对值本身执行一些操作。
举个例子:如果我的矩阵 a
是 n 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
这也适用于更高维度,但输出的指导性较差,难以想象。