如何按numpy数组首列权重值重复对应行得到正确二维数组
问题原因
你的原有代码存在两处错误,导致结果不符合预期:
- 重复计数逻辑错误:权重值为n的行,你先手动追加了1次原始行,又追加了
np.repeat生成的n份副本,实际总重复次数为n+1次,这就是np.sum(chain[:,0])与结果长度不相等的根本原因 - 结果结构错误:直接向列表中混合追加一维数组、二维数组,最终没有做数组拼接,得到的是嵌套的混合列表,不是规整的二维数组
最优实现方案
不需要编写循环,numpy原生np.repeat原生支持逐行指定重复次数,向量化运算效率远高于循环写法,完全适配你15413行的大数组场景:
import numpy as np # 示例数组 chain = np.array([[1, 5, 3], [2, 2, 1], [3, 0, 1]]) # 沿行方向(axis=0),按第一列的权重值重复对应行,先转int避免浮点数权重报错 ACT_chain = np.repeat(chain, repeats=chain[:, 0].astype(int), axis=0)
运行后验证结果:
np.sum(chain[:,0])返回值为6,len(ACT_chain)返回值为6,二者完全匹配- 输出结果与预期完全一致:
array([[1, 5, 3], [2, 2, 1], [2, 2, 1], [3, 0, 1], [3, 0, 1], [3, 0, 1]])
原有循环写法修正(不推荐)
如果要保留循环逻辑,需要删除多余的单次行追加逻辑,每次按权重生成对应数量的行块存入列表,最后统一做垂直拼接即可,该写法效率远低于上述向量化方案,不建议用于大数组:
ACT_chain = [] for i in range(len(chain)): repeat_cnt = int(chain[i, 0]) # 取出当前行保持二维结构,按权重重复 row_block = np.repeat(chain[i:i+1, :], repeat_cnt, axis=0) ACT_chain.append(row_block) # 拼接所有行块得到规整二维数组 ACT_chain = np.vstack(ACT_chain)
内容的提问来源于stack exchange,提问作者user9404237
相关产品推荐
相关产品推荐

