np.where 在没有屏蔽数组或任何第二个参数的二维数组上

np.where on 2D array without masked array or any second argument

我正在检查一个代码片段,有一个代码如下

z = [[True, False, True],[True, True, True],[False, False, False]]
xz, yz = np.where(z)
print(xz)
print(yz)

这个returns

[0 0 1 1 1]
[0 2 0 1 2]

如果我做

z = [[True, False, True],[True, True, True]]

我会得到与

相同的结果
[0 0 1 1 1]
[0 2 0 1 2]

当我做的时候

z = [[True, False],[True, True]]

结果是

[0 1 1]
[0 0 1]

我没能弄清楚它在做什么,这是在 github 上的 SynthText repo 中介绍的。 如果有人可以帮助理解它的作用,我将不胜感激?它的应用是什么?

如果您仔细阅读 np.where, you find that it's equvivalent to np.asarray(condition).nonzero() in case you only provide the condition parameter, so the behaviour comes down to np.nonzero 上的文档。

>>> z = np.array([[True, False], [True, True]])

此数组中有三个非零元素,索引为:[0, 0][1, 0][1, 1]

>>> np.nonzero(z)
(array([0, 1, 1], dtype=int64), array([0, 0, 1], dtype=int64))

元组的第一个元素是每个非零元素的第一个索引 ([0, 1, 1]),元组的第二个元素是每个非零元素的第二个索引 ([0, 0, 1])。

如果我们考虑二维数组,例如矩阵,np.where(z) 有助于获取元素的索引为 True 或非零。二维数组索引有两个分量,对应于数组的每个元素,如 [rows' number, columns' number]。 第一个变量,即您示例中的 xz,显示 True 或非零元素的行号,yz 显示相应列的号。以下代码可能有助于理解:

xz = [1th-x, 2nd-x, 3rd-x]
yz = [1th-y, 2nd-y, 3rd-y]
nonzero_indices = [[1th-x, 1th-y], [2nd-x, 2nd-y], [3rd-x, 3rd-y]]

使用以下代码将获取每个 True 或非零元素的索引,因为它在上面的代码中显示为 nonzero_indices

print(np.transpose(np.where(z)))

这会给出 [[0 0] [1 0] [1 1]]
希望对你有帮助。