如何扩展3D NumPy数组的深度维度?求通用实现方案
问题描述
假设有一个形状为3x3x1的3D NumPy数组:
[[[149] [121] [189]] [[ 32] [225] [ 44]] [[ 33] [133] [ 11]]]
希望将其扩展为3x3x3的数组,使最深层的每个值重复三次,目标数组如下:
[[[149 149 149] [121 121 121] [189 189 189]] [[ 32 32 32] [225 225 225] [ 44 44 44]] [[ 33 33 33] [133 133 133] [ 11 11 11]]]
尝试了以下代码:
for i in range(len(array)): for j in range(len(array[i])): array[i][j] = np.array(list(array[i][j]) * 3) print(array)
但出现错误:
could not broadcast input array from shape (3,) into shape (1,)
需要实现针对m×n×p格式的数组的此类扩展。
解决方案
错误原因是原数组中每个array[i][j]的形状为(1,),而你赋值的是形状(3,)的数组,无法直接广播替换。NumPy提供了高效的内置方法完成这类维度扩展,无需手动循环:
方法1:使用np.tile
tile可在指定维度上重复数组,适合扩展最后一维的场景:
import numpy as np # 初始化原数组 arr = np.array([[[149], [121], [189]], [[32], [225], [44]], [[33], [133], [11]]]) # 前两个维度不重复,最后一维重复3次 result = np.tile(arr, (1, 1, 3)) print(result.shape) # 输出 (3, 3, 3)
针对m×n×p格式的数组,只需调整tile的第三个参数为需要扩展的次数即可。
方法2:使用np.repeat
repeat可按指定轴重复元素,精准控制扩展维度:
# 在第三个维度(索引从0开始)重复每个元素3次 result = np.repeat(arr, 3, axis=2) print(result.shape) # 输出 (3, 3, 3)
此方式适用于任意m×n×p的数组,只需修改重复次数和对应的轴参数即可。
方法3:重塑+广播(原理参考)
利用NumPy广播机制,先将原数组重塑为m×n的2D数组,再扩展维度实现广播:
result = arr.reshape(arr.shape[0], arr.shape[1], 1) * np.ones((1,1,3), dtype=arr.dtype)
该方式效率略低于前两种,仅作原理展示。
内容的提问来源于stack exchange,提问作者Jordy
相关产品推荐
相关产品推荐

