给定一个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
等等。
我该怎么做?
答案 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()
作为示例。