如何vstack或拼接不同形状的NumPy矩阵并实现遍历操作?
问题原因
np.vstack要求所有输入数组除了拼接轴外的其余维度完全一致,你当前使用的a形状为(3,3)、b形状为(3,2),二者轴1(列维度)长度不同,无法直接堆叠为统一结构的二维数值数组,因此触发报错。
你期望的输出并不是常规的高维数值数组(numpy的常规数值数组要求所有子元素的维度统一),而是将不同形状的矩阵作为独立元素存储的容器,两种实现方案如下:
方案1:使用Python列表存储(推荐)
如果你的需求仅为遍历每个子矩阵处理,直接使用Python列表即可,实现最简单,也没有额外开销:
import numpy as np a = np.array([[3,3,3],[3,3,3],[3,3,3]]) b = np.array([[2,2],[2,2],[2,2]]) # 直接将矩阵存入列表 matrix_container = [a, b] # 遍历逻辑和你预期完全一致 for matrix in matrix_container: row = matrix[1] print(row)
输出结果:
[3 3 3] [2 2]
方案2:创建object类型的numpy数组
如果你确实需要使用numpy数组格式存储,可以指定dtype=object生成元素为任意对象的numpy数组,和你期望的输出格式完全匹配:
import numpy as np a = np.array([[3,3,3],[3,3,3],[3,3,3]]) b = np.array([[2,2],[2,2],[2,2]]) # 生成object类型的numpy数组 matrix_container = np.array([a, b], dtype=object) # 遍历逻辑不变 for matrix in matrix_container: row = matrix[1] print(row)
打印matrix_container的结果和你期望的输出一致:
array([array([[3, 3, 3], [3, 3, 3], [3, 3, 3]]), array([[2, 2], [2, 2], [2, 2]])], dtype=object)
注意:object类型的numpy数组无法使用numpy的向量化运算特性,如果没有特殊需求,优先使用普通Python列表即可。
内容的提问来源于stack exchange,提问作者C.L.
相关产品推荐
相关产品推荐

