如何将单元素列表构成的NumPy数组转换为二维int数组
NumPy移除单元素内层列表转普通整型数组
问题场景
现有由单元素列表组成的NumPy数组,定义如下:
aaa = np.array( [[ [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0] ], [ [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0] ], [ [0], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4] ] ] )
需要将内层单元素列表转换为int类型值,最终得到如下结构的目标数组:
nnn = np.array( [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ]] )
直接调用无参数的sum()会累加数组所有值,尝试过的其他方法也始终保留内层列表结构,无法得到预期结果。
实现方法
原数组aaa的维度为(3, 20, 1),最后一个长度为1的维度就是包裹单值的冗余层,不需要遍历或做数值计算,直接移除该冗余维度即可得到目标结果,常用实现方式有3种:
- 方法1:使用
np.squeeze()自动移除所有长度为1的维度,通用性最好,不需要提前知道数组形状nnn = np.squeeze(aaa) - 方法2:直接索引提取最后一个维度的第0位元素,适合明确知道冗余层在最后一维的场景
nnn = aaa[..., 0] - 方法3:通过
reshape指定目标形状,适合已知前两维固定尺寸的场景nnn = aaa.reshape(3, 20)
结果验证
运行如下代码可验证输出完全匹配目标数组:
import numpy as np aaa = np.array( [[ [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0] ], [ [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0], [0] ], [ [0], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4], [4] ] ] ) nnn = np.squeeze(aaa) print(nnn.shape) # 输出 (3, 20) print(nnn) # 输出结果: # [[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] # [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] # [0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4]]
之前用sum()出错是因为没有指定求和轴,如果指定在最后一个轴求和
aaa.sum(axis=-1)也能得到相同结果,但求和属于数值计算操作,效率低于直接移除冗余维度的方案,非必要不使用。
内容的提问来源于stack exchange,提问作者jc508
相关产品推荐
相关产品推荐

