繁体   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