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

如何用两个NumPy数组构造指定格式的矩阵?

问题解决:NumPy数组生成配对矩阵时的索引错误

问题重现

你的代码如下:

import numpy as np

MC=np.array([1, 2, 3])
oo=np.array([4,5,6])

for i in range(0, len(MC)): 
    for j in range(0, len(oo)):
        H[i,j]=(MC[i],oo[j])   

print(oo)    
print(H)

期望输出:

H=[[(1,4),(1,5),(1,6)],[(2,4),(2,5),(2,6)],[(3,4),(3,5),(3,6)]]

运行时触发错误:list indices must be integers or slices, not tuple

错误原因

  • 未提前初始化H,Python会将其视为普通列表,但普通列表不支持H[i,j]这种二维索引方式,该写法传递的是元组(i,j)作为索引,列表只能接受整数或切片索引。
  • 即便提前初始化列表,正确的二维索引写法应为H[i][j],而非H[i,j]。

解决方法

方法1:用Python列表初始化并填充

先创建一个空的二维列表,再通过双层循环赋值:

import numpy as np

MC = np.array([1, 2, 3])
oo = np.array([4,5,6])

# 初始化3x3的空列表
H = [[None for _ in range(len(oo))] for _ in range(len(MC))]
for i in range(len(MC)): 
    for j in range(len(oo)):
        H[i][j] = (MC[i], oo[j])   

print(oo)    
print(H)

运行后直接得到你期望的列表格式输出。

方法2:用NumPy广播机制高效实现(适合NumPy数组场景)

如果需要生成NumPy数组格式的结果,可利用广播扩展维度后生成配对:

import numpy as np

MC = np.array([1, 2, 3])
oo = np.array([4,5,6])

# 扩展维度实现广播
MC_expanded = MC[:, np.newaxis]  # 形状变为(3,1)
oo_expanded = oo[np.newaxis, :]  # 形状变为(1,3)

# 生成所有配对并重塑形状
H = np.column_stack((MC_expanded.flatten(), oo_expanded.flatten())).reshape(3,3)

print(oo)
print(H.tolist())  # 转换为列表格式与期望一致

方法3:用itertools.product简化配对生成

借助itertools.product直接生成所有元素配对,再重新塑形:

import numpy as np
from itertools import product

MC = np.array([1, 2, 3])
oo = np.array([4,5,6])

# 生成所有(MC元素, oo元素)的配对
all_pairs = list(product(MC, oo))
# 重新分组为3x3的列表
H = [all_pairs[i*3 : (i+1)*3] for i in range(3)]

print(oo)
print(H)

内容的提问来源于stack exchange,提问作者ELLA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:55:29