如何在numpy.ufunc.at中引用所有行或指定列切片?
解决numpy.ufunc.at中引用所有行/指定列的切片问题
你遇到的语法错误是因为在np.add.at的索引参数里,直接使用[:,[0,1]]或者[,[0,1]]不符合Python的语法规则。对于二维数组的索引,np.add.at需要你把行索引和列索引包装成元组来传递,下面是具体的解决方法:
正确写法:用元组传递行/列索引
要对所有行的指定列执行add.at操作,你需要把行索引(所有行)和列索引(指定列)放在一个元组里。有两种常用的方式表示“所有行”:
方式1:使用slice(None)表示所有行
import numpy as np c = np.array([[1,2,4],[5,3,4]]) # 对所有行的第0、1列加999 np.add.at(c, (slice(None), [0,1]), 999) print(c)
输出:
[[1000 1001 4] [1004 1002 4]]
方式2:使用...(Ellipsis)表示所有行
...是numpy中用来表示“剩余所有维度”的简写,对于二维数组来说,它等价于slice(None):
c = np.array([[1,2,4],[5,3,4]]) np.add.at(c, (..., [0,1]), 999) print(c)
输出和上面完全一致。
为什么你的写法会报错?
- 写法一
[,[0,1]]:这是完全无效的Python语法,列表里不能直接以逗号开头,没有任何意义。 - 写法二
[:,[0,1]]:虽然这种写法在直接索引numpy数组时是合法的(比如c[:,[0,1]]),但这是numpy提供的语法糖,背后实际是把索引解析为元组(slice(None), [0,1])。而在函数参数中,你不能直接写[:,[0,1]],必须显式地包装成元组,否则Python解释器会把它当成错误的语法。
补充:你的列操作为什么能正常运行?
你之前的代码np.add.at(c, [[0,1],], 999)能正常工作,是因为numpy会自动把二维的行索引列表[[0,1],]补全为([0,1], slice(None)),也就是对第0、1行的所有列执行操作。如果想让代码更清晰,也可以写成元组形式:
np.add.at(c, ([0,1], slice(None)), 999)
内容的提问来源于stack exchange,提问作者figs_and_nuts
相关产品推荐
相关产品推荐

