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() 为例。