如何将形状为(3,4,2)的Numpy数组重塑为目标结构的2D数组
如何重塑Numpy数组为指定2D结构?
原始Numpy数组定义如下:
import numpy as np a1 = [["a1", "a2"], ["a3", "a4"], ["a5", "a6"], ["a7", "a8"]] b1 = [["b1", "b2"], ["b3", "b4"], ["b5", "b6"], ["b7","b8"]] c1 = [["c1", "c2"], ["c3", "c4"], ["c5", "c6"], ["c7","c8"]] arr = np.array([a1, b1, c1]) # arr.shape 输出 (3, 4, 2)
期望重塑后的2D数组结构为:
["a1","b1","c1"], ["a2","b2","c2"], ..., ["a8","b8","c8"]
以下是尝试过但不符合预期的方法:
- 使用
reshape((8,3)):
arr.reshape((8,3)) # 输出: # array([['a1', 'a2', 'a3'], # ['a4', 'a5', 'a6'], # ['a7', 'a8', 'b1'], # ['b2', 'b3', 'b4'], # ['b5', 'b6', 'b7'], # ['b8', 'c1', 'c2'], # ['c3', 'c4', 'c5'], # ['c6', 'c7', 'c8']])
- 使用
arr.T.reshape(8,3):
arr.T.reshape(8,3) # 输出: # array([['a1', 'b1', 'c1'], # ['a3', 'b3', 'c3'], # ['a5', 'b5', 'c5'], # ['a7', 'b7', 'c7'], # ['a2', 'b2', 'c2'], # ['a4', 'b4', 'c4'], # ['a6', 'b6', 'c6'], # ['a8', 'b8', 'c8']])
- 使用
arr.ravel().reshape(8,3):
arr.ravel().reshape(8,3) # 输出: # array([['a1', 'a2', 'a3'], # ['a4', 'a5', 'a6'], # ['a7', 'a8', 'b1'], # ['b2', 'b3', 'b4'], # ['b5', 'b6', 'b7'], # ['b8', 'c1', 'c2'], # ['c3', 'c4', 'c5'], # ['c6', 'c7', 'c8']])
正确实现方法
可以通过调整数组的轴顺序,再进行重塑来实现:
# 先交换轴,将原来的(3,4,2)转为(4,2,3),再重塑为(8,3) result = arr.transpose(1, 2, 0).reshape(8, 3)
或者使用moveaxis来调整轴:
result = np.moveaxis(arr, 0, -1).reshape(8, 3)
输出结果符合预期:
array([['a1', 'b1', 'c1'], ['a2', 'b2', 'c2'], ['a3', 'b3', 'c3'], ['a4', 'b4', 'c4'], ['a5', 'b5', 'c5'], ['a6', 'b6', 'c6'], ['a7', 'b7', 'c7'], ['a8', 'b8', 'c8']], dtype='<U2')
原理说明
原始数组的形状是(3,4,2),对应维度分别是组(a1/b1/c1)、行、列。我们需要把每个组中相同位置的元素放在同一行,所以首先要把组这个维度移到最后,变成(4,2,3),这样每个(2,3)的子数组就是对应行的所有元素,再把整个数组展平为(8,3)就得到了想要的结构。
内容的提问来源于stack exchange,提问作者Bera
相关产品推荐
相关产品推荐

