Numpy:分配目的地是只读的 - 广播

时间:2018-04-05 13:38:05

标签: python numpy numpy-broadcasting

我从2D数组开始,想要将其广播到3D数组(例如从灰度图像到rgb图像)。这是我使用的代码。

>>> img_grey = np.random.randn(4, 4)
>>> img_rgb = np.broadcast_to(np.expand_dims(img_grey, axis=-1), (4, 4, 3))

这将创建一个按预期工作的数组img_rgb:3个彩色通道(最后一个维度),每个切片等于原始灰度图像。但是,如果我这样做

>>> img_rgb[0, 0, 0] = 0.
ValueError: assignment destination is read-only

我无法更改rgb图像!

1 个答案:

答案 0 :(得分:1)

原因是broadcast_to不会在内存中创建新数组。相反,您只需查看原始数据。通过检查标志可以看出这一点。

>>> img_rg.flags
C_CONTIGUOUS : False
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : False
ALIGNED : True
UPDATEIFCOPY : False

特别是,OWNDATA标志设置为False(这意味着数组从另一个对象借用内存),以及WRITEABLE标志为False(这就是您无法更改对象的原因)。请参阅numpy flags documentation

解决方法是创建数组的副本。

>>> img_rgb = np.broadcast_to(np.expand_dims(img_grey, axis=-1), (4, 4, 3)).copy()
>>> img_rgb[0, 0, 0] = 0.  # works!

这为rgb图像提供了自己的存储空间,可以在不改变灰度图像的情况下进行更改。因此,OWNDATA和WRITEABLE标志也设置为True。