如何不使用循环将numpy N维数组转换为(N-1)维数组组成的列表
问题解决方案
你给出的循环逻辑本质是在形状为(7, 3, 6)的原数组的1号轴(从0开始计数)位置插入一个长度为1的新维度,直接使用numpy内置的维度操作即可实现,不需要写Python层面的循环,三种常用实现方式如下:
方法1:使用
np.expand_dims(可读性最高,推荐使用)
直接在指定轴位置插入新维度,代码如下:import numpy as np # 构造原数组 arr3d = np.random.randint(1, 100, size=7 * 3 * 6).reshape((7, 3, 6)) # 插入新维度得到目标结果 arr_what_i_want = np.expand_dims(arr3d, axis=1)此时得到的
arr_what_i_want形状为(7, 1, 3, 6),将你循环得到的列表转为numpy数组后二者完全相等。方法2:使用
np.newaxis索引拓展
通过numpy的索引语法直接新增维度:arr_what_i_want = arr3d[:, np.newaxis, ...]方法3:使用
reshape直接调整形状
因为数组总元素数不变,直接指定新形状即可:arr_what_i_want = arr3d.reshape(7, 1, 3, 6)
你可以通过以下代码验证结果和原循环版本完全一致:
# 原循环版本结果 arr_loop = [] for i in range(7): arr2d = arr3d[i] arr_loop.append([arr2d]) # 转为numpy数组后对比 print(np.array_equal(np.array(arr_loop), arr_what_i_want)) # 输出为True
如果你需要和原循环完全一致的嵌套列表结构,只需要在上述结果后调用.tolist()方法即可,也不需要额外写循环。
内容的提问来源于stack exchange,提问作者guzuomuse
相关产品推荐
相关产品推荐

