Numpy广播生成3D数组后赋值报错:assignment destination is read-only
解决numpy广播视图无法赋值的问题
嘿,这个问题我太熟悉啦!你遇到的ValueError: assignment destination is read-only是因为np.broadcast_to返回的并不是一个独立的可修改数组,而是原灰度数组的只读广播视图——它并没有真正开辟新内存来存储三个通道的数据,只是复用了原数组的内容,所以自然不允许你修改它。
下面给你几种可行的解决办法:
方法1:用np.repeat生成可写的拷贝
np.repeat会直接在指定维度上复制数据,生成真正独立的数组,支持后续修改:
import numpy as np img_grey = np.random.randn(4, 4) # 先扩展维度,再在最后一维重复3次 img_rgb = np.repeat(np.expand_dims(img_grey, axis=-1), repeats=3, axis=-1) # 现在赋值就没问题啦 img_rgb[0, 0, 0] = 0
方法2:对广播视图调用.copy()
如果你坚持想用np.broadcast_to,只需要在后面加上.copy(),把只读视图转换成可写的数组拷贝:
import numpy as np img_grey = np.random.randn(4, 4) img_rgb = np.broadcast_to(np.expand_dims(img_grey, axis=-1), (4, 4, 3)).copy() # 尝试赋值,不会报错 img_rgb[0, 0, 0] = 0
方法3:用np.tile实现多通道复制
np.tile可以把数组像瓷砖一样重复拼接,也能生成可写的数组:
import numpy as np img_grey = np.random.randn(4, 4) # (1,1,3)表示在第0、1维不重复,第2维重复3次 img_rgb = np.tile(np.expand_dims(img_grey, axis=-1), (1, 1, 3)) # 修改操作正常执行 img_rgb[0, 0, 0] = 0
这几种方法都能解决你的赋值问题,其中np.repeat是最贴合“单通道转多通道”场景的选择哦~
内容的提问来源于stack exchange,提问作者wouterdobbels
相关产品推荐
相关产品推荐

