Numpy:如何为多维数组的单个元素赋值?
我正在处理三维数组(在这个例子中,你可以想象它们代表屏幕上某个点的RGB值)。
>>> import numpy as np
>>> a = np.floor(10 * np.random.random((2, 2, 3)))
>>> a
array([[[ 7., 3., 1.],
[ 9., 6., 9.]],
[[ 4., 6., 8.],
[ 8., 1., 1.]]])
我想做的是把那些绿色通道值已经低于5的像素的G通道设置为一个任意值。我可以通过以下方式找到我感兴趣的像素:
>>> a[np.where(a[:, :, 1] < 5)]
array([[ 7., 3., 1.],
[ 8., 1., 1.]])
但我在理解如何仅仅给G通道赋新值这方面遇到了困难。我试过:
>>> a[np.where(a[:, :, 1] < 5)][1] = 9
>>> a
array([[[ 7., 3., 1.],
[ 9., 6., 9.]],
[[ 4., 6., 8.],
[ 8., 1., 1.]]])
...但似乎没有任何效果。我也试过:
>>> a[np.where(a[:, :, 1] < 5), 1] = 9
>>> a
array([[[ 7., 3., 1.],
[ 9., 9., 9.]],
[[ 4., 6., 8.],
[ 9., 9., 9.]]])
...(还是搞不清楚发生了什么)。最后我试了:
>>> a[np.where(a[:, :, 1] < 5)][:, 1] = 9
>>> a
array([[[ 7., 3., 1.],
[ 9., 6., 9.]],
[[ 4., 6., 8.],
[ 8., 1., 1.]]])
我怀疑我在理解NumPy这个库时缺少了一些基本知识(这是我第一次使用这个库)。我希望能得到一些帮助,告诉我如何实现我的目标,以及解释一下我之前尝试时发生了什么。
非常感谢你们的帮助和专业指导!
编辑:我想要的结果是:
>>> a
array([[[ 7., 9., 1.], # changed the second number here
[ 9., 6., 9.]],
[[ 4., 6., 8.],
[ 8., 9., 1.]]]) # changed the second number here
2 个回答
1
其实你不需要使用 where
,你可以直接用比较操作符得到的布尔数组来索引一个数组。
a=array([[[ 7., 3., 1.],
[ 9., 6., 9.]],
[[ 4., 6., 8.],
[ 8., 1., 1.]]])
>>> a[a[:, :, 1] < 5]
array([[ 7., 3., 1.],
[ 8., 1., 1.]])
>>> a[a[:, :, 1] < 5]=9
>>> a
array([[[ 9., 9., 9.],
[ 9., 6., 9.]],
[[ 4., 6., 8.],
[ 9., 9., 9.]]])
你在提问时没有列出你期望的输出,所以我不太确定这是不是你想要的结果。
5
>>> import numpy as np
>>> a = np.array([[[ 7., 3., 1.],
... [ 9., 6., 9.]],
...
... [[ 4., 6., 8.],
... [ 8., 1., 1.]]])
>>> a
array([[[ 7., 3., 1.],
[ 9., 6., 9.]],
[[ 4., 6., 8.],
[ 8., 1., 1.]]])
>>> a[:,:,1][a[:,:,1] <; 5 ] = 9
>>> a
array([[[ 7., 9., 1.],
[ 9., 6., 9.]],
[[ 4., 6., 8.],
[ 8., 9., 1.]]])
使用 a[:,:,1]
这个代码可以获取到图像中的绿色通道。接着,我用 a[:,:,1] < 5
这个条件来筛选出绿色通道中小于5的那些元素,然后把这些选中的元素的值都改成了9。