如何通过二维数组索引为Numpy数组赋值(非迭代实现)
用Numpy高级索引实现无循环的数组赋值(Pythonic方案)
这事儿用Numpy的高级索引就能完美解决,完全不用写循环,既符合Pythonic的简洁风格,又能发挥Numpy的矢量运算效率。
先把你的示例环境搭好:
import numpy as np import itertools p = 4 combos = np.asarray(list(itertools.combinations(range(p), 3))) subbins = np.zeros(shape=(len(combos), p), dtype=int) # 指定int类型,避免默认浮点数
核心实现(一行代码搞定)
直接用Numpy的广播式索引来赋值:
subbins[np.arange(len(combos))[:, None], combos] = 1
代码逻辑解释
np.arange(len(combos))生成行索引数组[0,1,2,3],加上[:, None]是把它转换成列向量(形状变成(4,1)),这样就能和combos的(4,3)形状匹配,实现每行对应每行的列索引。- 这种索引方式会让Numpy自动把行索引和列索引一一对应,给
subbins[i, combos[i]]的所有位置都赋值为1,正好满足你的需求。
运行后打印subbins就能得到你要的结果:
print(subbins) # 输出: # [[1 1 1 0] # [1 1 0 1] # [1 0 1 1] # [0 1 1 1]]
另一种简洁写法:用np.put_along
如果你觉得索引写法有点绕,也可以用Numpy专门提供的put_along函数,语义更直观:
np.put_along(subbins, combos, 1, axis=1)
这个函数的作用就是沿着指定轴(这里是列轴axis=1),把每个行里对应combos索引的位置替换成1,效果和上面的索引写法完全一致。
内容的提问来源于stack exchange,提问作者Dr. Andrew
相关产品推荐
相关产品推荐

