在 Python 中,接收大小为 n*n 的 ndarray 中所有大于 x 的元素的索引。

4

我有一个大小为 n*n (200,200) 的 ndarray

我想要找到所有大于0的值的索引,然后将它们改为1。

我尝试做了一些类似的操作,但是遇到了异常。

toggleOn_index = [x for x in  net if x>0]
net[toggleOn_index]=1

什么是最有效的方法来做到这一点?
2个回答

4
如果我从以下数组a开始:
>>> a = np.random.rand(5, 5) - 0.5
>>> a
array([[ 0.24116601, -0.23917393,  0.46607471,  0.08560729,  0.33878893],
       [ 0.24681769, -0.01693847,  0.22579766, -0.38570793, -0.2075437 ],
       [-0.19602781, -0.46108244, -0.40341244,  0.42579818,  0.4655471 ],
       [-0.14669409,  0.36171014, -0.36496558, -0.30983999, -0.06633584],
       [-0.09159042,  0.23346471,  0.37680536, -0.09281205, -0.04552193]])

我可以使用以下方式将所有大于0的元素分配:

>>> a[a > 0] = 1
>>> a
array([[ 1.        , -0.23917393,  1.        ,  1.        ,  1.        ],
       [ 1.        , -0.01693847,  1.        , -0.38570793, -0.2075437 ],
       [-0.19602781, -0.46108244, -0.40341244,  1.        ,  1.        ],
       [-0.14669409,  1.        , -0.36496558, -0.30983999, -0.06633584],
       [-0.09159042,  1.        ,  1.        , -0.09281205, -0.04552193]])

2
你的方法存在问题,因为x>0会返回一个一维布尔数组:
import numpy as np

net = np.random.random((2, 5))

for i in net:
    print(i > 0)
# [ True  True  True  True  True]
# [ True  True  True  True  True]

但你不能用 if 语句来评估这些数组:
if np.array([True, True, True, True, True]):
    pass

数值错误:具有多个元素的数组的真实值是模糊的。请使用 a.any() 或 a.all()


正如前面提到的,NumPy支持逐元素操作,所以您可以简单地使用:

net[net > 0] = 1

如果您想要一个替换了值的新数组,可以使用带有三个参数的np.where形式:

newnet = np.where(net > 0, 1, net)

要直接获取索引,您可以使用np.where的单参数形式:

indices = np.where(net > 0)
net[indices] = 1               # it can also be used to set the elements to 1.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接