Numpy 3D数组按列转2D数组 如何避免使用列表推导式实现
问题解决办法
你生成的3D数组arr形状为(3, 4, 2),三个维度分别对应「DataFrame个数」、「单个DataFrame的行数」、「单个DataFrame的列数」。原列表推导式的逻辑是对每个DataFrame对应的二维数组做转置(把(4,2)转为(2,4)),再拉平为1维数组,最终得到形状为(3, 8)的2D数组。
错误原因
你直接使用arr.T.reshape(3,-1)不符合预期的原因是:直接对3D数组执行.T操作会反转所有轴的顺序,原轴顺序(0,1,2)会变成(2,1,0),得到的数组形状为(2,4,3),后续reshape后数据排布顺序和预期完全不同。
正确实现方法
不需要循环,仅用transpose方法交换每个DataFrame对应的后两个维度,再做reshape即可实现和列表推导式完全一致的效果:
import pandas as pd import numpy as np # 原始生成代码 alist_df=[pd.DataFrame(np.random.randint(100,size=(4,2))) for _ in range (3)] arr=np.array(alist_df) # 一行实现需求,适配任意数量的DataFrame、任意行列数的输入 arr_opt = arr.transpose(0, 2, 1).reshape(len(alist_df), -1)
结果验证
可以用如下代码验证结果和原列表推导式输出完全一致:
# 原列表推导式实现 arr_opt_old = np.array([narr.T.reshape(-1) for narr in arr]) # 对比结果 print(np.array_equal(arr_opt, arr_opt_old)) # 输出为True
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

