如何基于索引修改numpy数组的原对象而非副本?
解决Numpy数组索引修改原对象的问题
嘿,这个numpy的索引坑我之前也踩过!你遇到的问题核心在于:整数数组索引返回的是数组副本,而非视图,所以你修改的只是临时生成的副本,原数组a自然不会有变化。
为什么原来的代码无效?
当你执行a[b, :]时,因为b是整数数组,numpy会创建一个原数组对应行的副本,而不是直接指向原数组的视图。后续的[:, b]又是在这个副本上操作,最后+=1只修改了副本,原数组a完全没被触及。
正确的修改方式
要直接修改原数组,你需要构造一个能直接索引到目标位置的二维索引,让numpy返回视图而非副本。这里有两种常用方法:
方法1:使用np.ix_()构造网格索引
np.ix_()可以把多个一维数组转换成能广播成二维网格的索引,这样索引得到的是原数组的视图,修改会直接作用到原数组:
import numpy as np a = np.array([[1,2,3],[4,5,6],[7,8,9]]) b = np.array([1,2]) # 用np.ix_构造正确的索引 a[np.ix_(b, b)] += 1 print(a) # 输出结果: # [[1 2 3] # [4 6 7] # [7 9 10]]
方法2:手动构造二维索引
通过把b转换成列向量(b[:, None]),和原b广播成二维索引矩阵,同样可以直接索引原数组的目标位置:
import numpy as np a = np.array([[1,2,3],[4,5,6],[7,8,9]]) b = np.array([1,2]) # 手动构造二维索引 a[b[:, None], b] += 1 print(a) # 输出和上面完全一致
关键知识点回顾
- 切片索引(比如
a[1:3, :])返回原数组的视图,修改视图会同步到原数组 - 整数数组索引(比如
a[b, :])返回原数组的副本,修改副本不影响原数组 - 要修改原数组,需确保索引操作返回的是视图,或者直接构造能定位到目标元素的索引矩阵
内容的提问来源于stack exchange,提问作者marc
相关产品推荐
相关产品推荐

