wou*_*els 6 python numpy array-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))
Run Code Online (Sandbox Code Playgroud)
这将创建一个img_rgb
按预期工作的数组:3 个彩色通道(最后一个维度),每个切片都等于原始灰度图像。但是,如果我这样做
>>> img_rgb[0, 0, 0] = 0.
ValueError: assignment destination is read-only
Run Code Online (Sandbox Code Playgroud)
我无法更改 rgb 图像!
原因是broadcast_to
没有在内存中创建新的数组。相反,您只需查看原始数据。这可以通过检查标志来看出。
>>> img_rg.flags
C_CONTIGUOUS : False
F_CONTIGUOUS : False
OWNDATA : False
WRITEABLE : False
ALIGNED : True
UPDATEIFCOPY : False
Run Code Online (Sandbox Code Playgroud)
特别是,OWNDATA 标志设置为 False(这意味着数组从另一个对象借用内存),并且 WRITEABLE 标志设置为 False(这就是您无法更改对象的原因)。请参阅numpy 标志文档。
解决方法是创建数组的副本。
>>> img_rgb = np.broadcast_to(np.expand_dims(img_grey, axis=-1), (4, 4, 3)).copy()
>>> img_rgb[0, 0, 0] = 0. # works!
Run Code Online (Sandbox Code Playgroud)
这为 RGB 图像提供了自己的内存空间,可以在不改变灰度图像的情况下更改该内存空间。因此 OWNDATA 和 WRITEABLE 标志也设置为 True。
归档时间: |
|
查看次数: |
12194 次 |
最近记录: |