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

Numpy数组__setitem__方法的异常赋值行为疑问

问题原因

你遇到的是Numpy花式索引的配对规则问题:
当你使用a[[1, 3], [0, 2]]这种双一维数组索引时,Numpy会把两个数组按位置配对,也就是取(行索引[0], 列索引[0])和(行索引[1], 列索引[1])这两个单独的元素——也就是(1,0)和(3,2),所以只会把这两个位置设为0,这就是你看到结果的原因。

而你预期的是选中第1行的0、2列,以及第3行的0、2列,这需要的是行和列的笛卡尔积索引,也就是所有行索引和列索引的组合。

正确实现方式

有两种常用的解决方法:

  • 方法一:用np.ix_生成可广播的索引网格,让行和列做笛卡尔积:
import numpy as np
a = np.array([
    [11, 12, 13],
    [21, 22, 23],
    [31, 32, 33],
    [41, 42, 43]
])
a[np.ix_([1, 3], [0, 2])] = 0

np.ix_会把[1,3]转换成[[1],[3]],[0,2]转换成[[0,2]],这样两者广播后就能覆盖所有需要的位置:(1,0)、(1,2)、(3,0)、(3,2)。

  • 方法二:直接分两次赋值,逻辑更直观:
a[1, [0, 2]] = 0
a[3, [0, 2]] = 0

执行后就能得到你预期的结果:

[[11 12 13]
 [ 0 22  0]
 [31 32 33]
 [ 0 42  0]]

内容的提问来源于stack exchange,提问作者IzaeDA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:25:56