Python中np.append拼接不同形状多维数组报错如何解决
NumPy数组拼接维度不匹配报错解决
报错原因
np.append底层调用np.concatenate实现数组拼接,沿指定轴拼接的强制规则为:除选定的拼接轴外,两个输入数组其余所有维度的尺寸必须完全一致。
你选择axis=0作为拼接轴时,两个数组维度尺寸对比如下:
- C1形状为
(1, 2, 2):axis=0尺寸1、axis=1尺寸2、axis=2尺寸2 - C2形状为
(1, 1, 2):axis=0尺寸1、axis=1尺寸1、axis=2尺寸2
二者axis=1的尺寸分别为2和1,不满足拼接要求,因此触发维度不匹配的ValueError。
另外你给出的期望输出存在两个需要明确的点:
- 期望的C3[1]是形状为
(1,2)的二维数组,和三维的C1维度、形状均不统一,无法拼接为常规的同构数值型NumPy数组,只能存储为对象类型数组或Python列表 - 期望输出中C3[1]的数值为
[2,3],和你代码中定义的C2数值[1,1]不一致,以下示例保留代码中定义的C2数值,需要对应值可自行替换。
调整方案
根据实际需求选择对应实现方式:
方案1:拼接为规则的数值型多维数组
如果需要得到统一维度的数值数组,需先对齐非拼接轴的尺寸,再执行拼接:
- 若要沿第二个维度(axis=1)拼接,两个数组其余维度尺寸天然匹配,可直接执行:
import numpy as np C1 = np.array([[[0, 1],[0,2]]]) C2 = np.array([[[1,1]]]) # 沿axis=1拼接,得到形状为(1, 3, 2)的数组 C3 = np.append(C1, C2, axis=1)
运行后C3输出为:
[[[0 1] [0 2] [1 1]]]
- 若确实需要沿axis=0拼接,需先将C2的axis=1尺寸填充至和C1一致(例如填充0值),再执行拼接:
# 对C2做填充,将形状调整为(1,2,2) C2_pad = np.pad(C2, ((0,0), (0,1), (0,0)), mode='constant') C3 = np.append(C1, C2_pad, axis=0)
拼接后C3形状为(2,2,2),输出为:
[[[0 1] [0 2]] [[1 1] [0 0]]]
方案2:实现你给出的期望输出效果(C3两个元素为独立、形状不同的数组)
这种场景不要使用np.append做数值拼接,直接用列表或者NumPy对象数组存储独立元素即可:
# 方式1:直接用Python列表存储,实现最简单 C3 = [ np.array([[[0, 1], [0, 2]]]), np.array([[2,3]]) # 替换为你需要的C3[1]内容即可 ] # 方式2:构造dtype为object的NumPy数组 C3 = np.empty(2, dtype=object) C3[0] = np.array([[[0, 1], [0, 2]]]) C3[1] = np.array([[2,3]])
两种方式都可以通过C3[0]、C3[1]直接访问对应数组,和你期望的调用方式一致。
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

