Numpy扩展2D矩阵为3D并填充第三轴时报错,如何修正?
解决Numpy中2D矩阵扩展为3D矩阵并填充0的维度不匹配问题
错误原因
你遇到的报错核心问题有两个:
np.append的第二个参数传入的是标量0,它是0维数组,而kernel已经是3维数组,两者维度不兼容,无法直接拼接。np.append不会修改原数组,必须将返回值重新赋值给kernel,否则原数组不会有任何变化。- 循环调用
np.append的效率极低,每次都会创建新数组,完全不适合批量填充场景。
修正方案
推荐以下两种高效简洁的方法,替代循环append的写法:
方法1:使用np.pad直接填充(最推荐)
np.pad可以一次性在指定轴上填充指定数量的0,代码简洁且性能最优:
import numpy as np kernel = np.ones((3,3)) / 9 # 将2D矩阵扩展为3D(第三轴长度为1) kernel = kernel[..., None] # 在第三轴的右侧填充27个0,pad_width参数格式为((轴0前后填充数), (轴1前后填充数), (轴2前后填充数)) kernel = np.pad(kernel, pad_width=((0,0), (0,0), (0,27)), mode='constant', constant_values=0) print(kernel.shape) # 输出 (3, 3, 28) print(kernel)
方法2:创建对应维度的0数组,用np.concatenate拼接
先创建和原数组前两维形状一致、第三轴长度为27的0数组,再沿第三轴完成拼接:
import numpy as np kernel = np.ones((3,3)) / 9 kernel = kernel[..., None] # 创建3×3×27的0数组 zeros_arr = np.zeros((3, 3, 27)) # 沿第三轴拼接原数组和0数组 kernel = np.concatenate([kernel, zeros_arr], axis=2) print(kernel.shape) # 输出 (3, 3, 28)
(不推荐)如果一定要用循环append
需要将标量0转换为和原数组维度匹配的3D数组,并且每次将np.append的返回值重新赋值给kernel:
import numpy as np kernel = np.ones((3,3)) / 9 kernel = kernel[..., None] for _ in range(27): # 创建3×3×1的0数组,保证维度和kernel一致 zero_slice = np.zeros((3, 3, 1)) kernel = np.append(kernel, zero_slice, axis=2) print(kernel.shape) # 输出 (3, 3, 28)
内容的提问来源于stack exchange,提问作者levgor
相关产品推荐
相关产品推荐

