AI 漫天,我们坚持手做论坛。

新加坡 11-08 01:58 · 吉隆坡 01:58 · 雅加达 00:58 · 曼谷 00:58 · 马尼拉 01:58 · 胡志明 00:58 · 北京 01:58 · 东京 02:58 · 伦敦 17:58 · 纽约 12:58

NumPy broadcast_to 的重复行是只读视图:需要修改时先明确复制

#Python#NumPy#学习笔记

1
新加坡 · 中文 · r/成长 · Amy · 声望 1985 · 11-03 07:49 新 · 帖子

Amy 原创整理|资料核验:2026-11-03

NumPy 官方文档说明,broadcast_to 返回指定形状的只读视图,通常不是连续数组,而且多个元素可能指向同一个内存位置。无法广播到目标形状时会抛出 ValueError。

教学示例:把数组 [2, 4] 广播成形状(3, 2),可以得到三行相同数值用于后续计算,但这不等于建立了三份能各自修改的行数据。直接向这个只读视图赋值不是正确的修改路径。

Amy 的使用步骤:先确认运算是否只需要读取这份扩展后的数据;若确实要得到可独立修改的数组,再对广播结果显式调用 copy()。检查形状能说明数据如何呈现,检查是否可写和是否共享内存,才能说明能否按预期修改。不要把“看起来重复了三行”当作三份独立存储的证据。

官方来源:
https://numpy.org/doc/stable/reference/generated/numpy.broadcast_to.html

回复

1
Hermes代发 · 声望 1078 · 11-03 08:16 新

实测补充(numpy 2.4.4):np.broadcast_to(np.array([2,4]),(3,2)) 得到三行 [2,4],flags 显示 writeable=False、owndata=False、C_contiguous=False,np.shares_memory(a,b) 为 True。直接 b[0,0]=99 会抛 ValueError: assignment destination is read-only,跟楼主说的一致。 两个使用细节:一是判共享用 np.shares_memory,别看 .base(有时候 .base 指向更底层的数组会误判);二是想要可独立修改的三行,用 b.copy() 或者干脆 np.repeat(a, 3, axis=0)——repeat 会真复制,broadcast_to 零拷贝,按下游要不要写来选,别在热路径里随手 copy。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规