如何用更少代码将二维NumPy数组垂直分割为新二维数组?
问题:如何用更少代码实现NumPy数组的行列转换,同时降低资源占用?
我编写了一段代码,本质是通过水平分割二维NumPy数组后生成新的二维数组,代码及输出如下:
import numpy as np array1 = np.asarray([[1, 2, 3]]) array2 = np.asarray([[4, 5, 6]]) array3 = np.asarray([[7, 8, 9]]) concatenated = np.concatenate((array1, array2, array3), axis=0) print(concatenated) column_split = np.hsplit(concatenated, array1.size) td_array = [] for array in column_split: td_array.append(array.flatten()) print(np.asarray(td_array))
输出结果:
[[1 2 3] [4 5 6] [7 8 9]] [[1 4 7] [2 5 8] [3 6 9]]
请问如何用更少的代码实现该功能?我担心应用到大型任务时会占用过多系统资源。
回答
你的核心需求其实是将二维数组的行列进行转置,完全不需要通过hsplit和循环flatten的方式实现,NumPy内置的转置操作就能高效完成,同时大幅减少代码量和资源占用。
优化方案1:合并后直接转置
先合并原始数组,再通过.T属性完成转置,这是最直观的优化方式:
import numpy as np array1 = np.asarray([[1, 2, 3]]) array2 = np.asarray([[4, 5, 6]]) array3 = np.asarray([[7, 8, 9]]) # 合并数组(用vstack比concatenate更简洁) concatenated = np.vstack([array1, array2, array3]) # 直接转置得到目标结果 result = concatenated.T print(concatenated) print(result)
优化方案2:直接构造数组后转置
如果可以直接构造完整的二维数组,代码会更短:
import numpy as np # 直接构造原始二维数组 concatenated = np.array([[1,2,3], [4,5,6], [7,8,9]]) result = concatenated.T print(concatenated) print(result)
为什么更高效?
- 避免了
hsplit生成多个子数组的内存开销,也省去了循环遍历、flatten和列表转数组的额外计算步骤。 - NumPy的转置操作是底层优化的视图操作(非特殊情况下不会复制数据),内存占用极低,处理大型数组时性能优势非常明显。
两种方案的输出结果和你原代码完全一致,但代码量减少了一半以上,资源占用大幅降低。
内容的提问来源于stack exchange,提问作者m2022m
相关产品推荐
相关产品推荐

