numpy数组打印索引的某个值

时间:2014-07-31 19:05:49

标签: python arrays numpy indexing

给定一个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等等。

我该怎么做?

3 个答案:

答案 0 :(得分:3)

如果你想获得一个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]

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

Numpy数组支持条件为true的返回元素。您可以使用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]))

注意,这是一个numpy数组的Python元组,第一个是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

现在请注意,这是所有X的3个数组(在本例中)的元组,所有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()作为示例。