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

数组作为索引传入另一数组未得预期结果,求原因及无循环实现法

问题分析与解决

错误原因

你的原代码逻辑是按列统计每个行索引在对应列中的出现次数,从预期结果来看这个逻辑本身是成立的,但实际输出不符大概率是以下问题导致:

  • 代码缩进错误:如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:00:38