数组作为索引传入另一数组未得预期结果,求原因及无循环实现法
问题分析与解决
错误原因
你的原代码逻辑是按列统计每个行索引在对应列中的出现次数,从预期结果来看这个逻辑本身是成立的,但实际输出不符大概率是以下问题导致:
- 代码缩进错误:如果
b[a[:,i],i] +=1没有正确缩进在for循环内,会只执行最后一次循环,结果偏离预期; a数组的形状不符合预期:比如你误以为a是2行3列,但实际定义的是3行2列,导致循环次数错误;- 对需求的理解偏差:如果你的真实需求是统计
a中每一行作为(i,j)索引对的出现次数,那原代码的逻辑就完全错误。
无循环实现方法
场景1:按列统计行索引出现次数(匹配你的预期结果)
方法1:使用np.add.at
np.add.at支持对数组的多个位置进行原子性加法操作,无需循环:
import numpy as np a = np.array([[1,2],[0,1],[1,2]]) b = np.zeros((3,3)) # 生成所有行索引和对应列索引 rows = a.flatten() cols = np.repeat(np.arange(a.shape[1]), a.shape[0]) # 对每个(行, 列)位置累加计数 np.add.at(b, (rows, cols), 1) print(b)
输出:
[[1. 0. 0.] [2. 1. 0.] [0. 2. 0.]]
方法2:使用np.bincount
将二维索引编码为一维整数,统计次数后还原为二维数组:
import numpy as np a = np.array([[1,2],[0,1],[1,2]]) b_shape = (3,3) rows = a.flatten() cols = np.repeat(np.arange(a.shape[1]), a.shape[0]) # 把二维索引转成一维编码 flat_indices = rows * b_shape[1] + cols # 统计每个编码的出现次数 counts = np.bincount(flat_indices, minlength=np.prod(b_shape)) # 还原为二维数组 b = counts.reshape(b_shape) print(b)
场景2:统计每行作为索引对的出现次数
如果你的真实需求是统计a中每一行(i,j)的出现次数(比如[1,2]出现2次),可以直接用np.add.at:
import numpy as np a = np.array([[1,2],[0,1],[1,2]]) b = np.zeros((3,3)) np.add.at(b, (a[:,0], a[:,1]), 1) print(b)
输出:
[[0. 1. 0.] [0. 0. 2.] [0. 0. 0.]]
内容的提问来源于stack exchange,提问作者SAI TEJA GILUKARA
相关产品推荐
相关产品推荐

