【问题标题】:Numpy: finding nonzero values along arbitrary dimensionNumpy:沿任意维度查找非零值
【发布时间】:2017-01-02 21:42:11
【问题描述】:

似乎我无法在 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

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

【问题讨论】:

    标签: arrays numpy matrix iteration array-broadcasting


    【解决方案1】:

    您可以滥用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
    

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

    【讨论】:

    • 谢谢,我没有意识到 argmax 会被这样滥用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    相关资源
    最近更新 更多