【问题标题】:numpy array print index of certain valuenumpy数组打印某个值的索引
【发布时间】:2014-09-23 20:59:56
【问题描述】:

给定一个 numpy 数组

A = np.array([[[29, 64, 83],
               [17, 92, 38],
               [67, 34, 20]],
              [[73, 28, 45],
               [19, 84, 61],
               [22, 63, 49]],
              [[48, 30, 13],
               [11, 52, 86],
               [62, 25, 12]]])

我想要某个值的索引,比如 63

该值不可能重复或丢失

我做到了

idx = np.where(A == 63)

print(idx)

我明白了

(array([1], dtype=int32), array([2], dtype=int32), array([1], dtype=int32))

我想要的是

[1, 2, 1]

作为列表或其他可迭代的,没有array, dtype=int32 等。

我该怎么做?

【问题讨论】:

    标签: python arrays numpy indexing


    【解决方案1】:

    如果你想取回一个 numpy 数组,只需使用 concatenate 函数:

    In [30]: np.concatenate(idx)
    Out[30]: array([1, 2, 1])
    

    如果您真的对 Python 列表感兴趣,那么只需:

    In [31]: np.concatenate(idx).tolist()
    Out[31]: [1, 2, 1]
    

    【讨论】:

      【解决方案2】:

      这种使用list-comprehensions 的方法怎么样?

         idx = [x[0] for x in np.where(A==63)]
      

      【讨论】:

      • 这似乎行得通。谢谢。我将不得不研究它以了解它在做什么。
      • 如果您想知道它是如何工作的,请查看列表理解。
      • 我不明白的是 x[0] 中的 0 在做什么
      • 它正在从数组中提取值[...]
      【解决方案3】:

      Numpy 数组支持返回条件为真的元素。您可以使用np.where(..) 或使用:

      >>> A==63
      array([[[False, False, False],
              [False, False, False],
              [False, False, False]],
      
             [[False, False, False],
              [False, False, False],
              [False,  True, False]],
      
             [[False, False, False],
              [False, False, False],
              [False, False, False]]], dtype=bool)
      

      然后,您可以使用数组的 .nonzero() 方法将该索引数组展平为仅 True 值:

      >>> (A==63).nonzero()
      (array([1]), array([2]), array([1]))
      

      请注意,这是一个 Python 元组 numpy 数组,第一个是 X 索引,第二个是 Y,然后是 A[X,Y,Z] 形式的 Z。

      仅对于一个元素,您可以使用 .r_ 将其展平:

      >>> np.r_[(A==63).nonzero()]
      array([1, 2, 1])
      

      如果你愿意,你可以生成一个 Python 列表:

      >>> np.r_[(A==63).nonzero()].tolist()
      [1, 2, 1]
      

      一个更有趣的用例是当矩阵中有多个索引为 True 时。考虑所有 >63 的值:

      >>> A>63
      array([[[False,  True,  True],
              [False,  True, False],
              [ True, False, False]],
      
             [[ True, False, False],
              [False,  True, False],
              [False, False, False]],
      
             [[False, False, False],
              [False, False,  True],
              [False, False, False]]], dtype=bool)
      

      您也可以使用 .nonzero() 方法或非零函数:

      >>> np.nonzero(A>63)
      (array([0, 0, 0, 0, 1, 1, 2]), array([0, 0, 1, 2, 0, 1, 1]), array([1, 2, 1, 0, 0, 1, 2]))
           ^^^ X's                      ^^^ Y's                              ^^^ Z's
      

      现在请注意,这是一个由 3 个数组组成的元组(在本例中),所有 X、所有 Y、所有 Z 按此顺序排列。

      您可以使用np.transpose 生成一个由[[X, Y, Z],...] 形式的元素索引组成的数组,如下所示:

      >>> np.transpose((A>63).nonzero())
      array([[0, 0, 1],
             [0, 0, 2],
             [0, 1, 1],
             [0, 2, 0],
             [1, 0, 0],
             [1, 1, 1],
             [2, 1, 2]])
      

      或者(例如适合人眼打印)你可以使用zip:

      >>> zip(*(A>63).nonzero())
      [(0, 0, 1), (0, 0, 2), (0, 1, 1), (0, 2, 0), (1, 0, 0), (1, 1, 1), (2, 1, 2)]
      

      或者,打印:

      >>> print '\n'.join([str(e) for e in zip(*(A>63).nonzero())])
      (0, 0, 1)
      (0, 0, 2)
      (0, 1, 1)
      (0, 2, 0)
      (1, 0, 0)
      (1, 1, 1)
      (2, 1, 2)
      

      当然,这也适用于单个元素:

      >>> zip(*(A==63).nonzero())[0]
      (1, 2, 1)
      

      或者numpy方式:

      >>> np.transpose((A==63).nonzero())[0]
      array([1, 2, 1])
      

      这里的所有方法都以np.where(A==63) 代替(A==63).nonzero() 为例。

      【讨论】:

        猜你喜欢
        • 2019-10-26
        • 2023-01-10
        • 2018-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多