Numpy技术问询:两段数组索引赋值代码为何表现不同?
为什么这两段NumPy代码的表现截然不同?
咱们用具体例子拆解两段代码的行为,就能一眼看出差异:
假设我们有:
- M=2,N=3
r = [0, 1]- 初始
P = np.zeros((2,3), dtype=int)
第一段代码:P[:, r] += 1
这里的[:, r]是NumPy的花式索引(fancy indexing),它的逻辑是:对P的每一行,都选取r里指定的所有列。也就是说,会取出一个M×M的子数组(这里就是2×2),然后给这个子数组的每个元素都加1。
执行后P会变成:
[[1 1 0] [1 1 0]]
因为每一行的第0、1列都被加了1。
第二段代码:for i in range(len(r)): P[i, r[i]] += 1
这段是普通的循环遍历,逻辑是逐行精准对应:对第i行,只找到r[i]对应的那一列,给这个单个元素加1。
执行后P会变成:
[[1 0 0] [0 1 0]]
只有P[0,0]和P[1,1]被加了1,其他元素不受影响。
核心差异总结
- 第一段用花式索引时,
[:, r]会把r作为列索引集,应用到每一行,相当于对每一行都做一次r列的批量操作。 - 第二段的循环是行与列一一绑定:第i行只操作第r[i]列,是逐个元素的定向修改。
简单说,前者是“每一行都给r里的所有列加1”,后者是“第i行给第r[i]列加1”,完全不是一个逻辑~
内容的提问来源于stack exchange,提问作者Vasile Alecsandri
相关产品推荐
相关产品推荐

