如何用两个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
相关产品推荐
相关产品推荐

