[英]Problem with array[np.argwhere(array==value)]
將np.argwhere
作為二維坐標列表會導致錯誤的結果。 例如:
import numpy as np
array = np.array([[1, 0, 1], [2, 0, 0], [2, 3, 0]])
coordinates = np.argwhere(array==1)
array[coordinates] = 3
print(array)
給出:
[[3 3 3]
[2 0 0]
[3 3 3]]
即使只應更改值1
。
In [163]: array = np.array([[1, 0, 1], [2, 0, 0], [2, 3, 0]])
In [164]: array
Out[164]:
array([[1, 0, 1],
[2, 0, 0],
[2, 3, 0]])
In [165]: array==1
Out[165]:
array([[ True, False, True],
[False, False, False],
[False, False, False]])
np.where/nonzero
找到 True 值的坐標,給出 arrays 的元組:
In [166]: np.nonzero(array==1)
Out[166]: (array([0, 0], dtype=int64), array([0, 2], dtype=int64))
該元組可以按原樣用於索引數組:
In [167]: array[np.nonzero(array==1)]
Out[167]: array([1, 1])
argwhere
返回相同的值,但作為二維數組,每個維度一列:
In [168]: np.argwhere(array==1)
Out[168]:
array([[0, 0],
[0, 2]], dtype=int64)
將它用作索引是錯誤的:
In [169]: array[np.argwhere(array==1),:]
Out[169]:
array([[[1, 0, 1],
[1, 0, 1]],
[[1, 0, 1],
[2, 3, 0]]])
我添加了:
以更清楚地表明它只是索引array
的第一維,而不是像 [167] 中的 arrays 元組所做的那樣。
要使用argwhere
索引我們必須做的數組:
In [170]: x = np.argwhere(array==1)
In [171]: x
Out[171]:
array([[0, 0],
[0, 2]], dtype=int64)
將每一列分別應用於維度:
In [172]: array[x[:,0], x[:,1]]
Out[172]: array([1, 1])
如果您想遍歷非零元素, argwhere
更有用:
In [173]: for i in x:
...: print(array[tuple(i)])
...:
1
1
但是正如所評論的那樣,您不需要where/argwhere
步驟; 只需使用 boolean 數組作為索引
In [174]: array[array==1]
Out[174]: array([1, 1])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.