如何简化numpy ndarray降维操作?将三维数组转为目标二维数组
更简洁的Numpy三维数组转二维方法
针对你遇到的三维numpy数组转二维的需求,其实用numpy内置的数组操作就能实现更简洁高效的转换,这里给你几个常用方案:
使用
squeeze()移除单维度轴
你的原数组形状是(4,1,2),其中中间的维度大小为1,用squeeze()可以直接移除所有大小为1的轴,一步得到目标数组:import numpy as np a = np.array([[[11,12]], [[21,22]], [[31,32]], [[41,42]]]) b = a.squeeze() # b的结果就是 [[11,12], [21,22], [31,32], [41,42]]这个方法的好处是无需指定具体维度,自动处理所有单维度轴,通用性很强。
直接索引切片
可以通过numpy的多维索引直接提取需要的部分,省略中间的单维度:b = a[:, 0] # 等价于 a[:, 0, :]这里
[:, 0]表示取所有第一维度的元素,每个元素取第二维度的第0个位置,直接得到形状为(4,2)的数组,非常直观。使用
reshape()重塑形状
如果明确知道目标形状,也可以用reshape()来转换:b = a.reshape(-1, 2) # -1表示让numpy自动计算该维度的长度这种方法适合知道目标维度结构的场景,当数组长度变化时,
-1会自动适配,不用手动修改数字。
关于你之前的尝试
你提到直接用[p[0] for p in a]得到的是列表而非ndarray,原因是列表推导会将遍历numpy数组得到的每个子数组收集为Python列表,而不是numpy数组。如果想用这种方式,确实需要再套一层np.array(),但显然上面的numpy内置方法更高效,尤其是处理大型数组时,vectorized操作比循环(列表推导本质是Python层面的循环)快得多。
内容的提问来源于stack exchange,提问作者Vasily A
相关产品推荐
相关产品推荐

