You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:12:05