gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:33:52 27 4
gpt4 key购买 nike

我从一个 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 个彩色 channel (最后一个维度),每个切片都等于原始灰度图像。但是,如果我这样做
>>> img_rgb[0, 0, 0] = 0.
ValueError: assignment destination is read-only

我无法更改 rgb 图像!

最佳答案

原因是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。

关于python - Numpy:分配目的地是只读的 - 广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49673804/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com