簡體   English   中英

數組問題 [np.argwhere(array==value)]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM