我正在尝试复制 numpy 的转置+展平方法。为了进行转置,我只将最后一个维度与我想要转置的维度交换。然后我将项目位置转换为
线性指数。然而,numpy.flatten() 的项目排序结果有所不同。我怎样才能实现相同的行为?所需的输出是 numpy 展平输出。问题是 numpy 如何实现这一点?
这是例子:
第1步:
假设我有一个由 K=16 个连续整数组成的一维数组:
1d_Arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])`
第2步:
我将其重塑为 (2,2,4) 维度。 (行、列、深度) == (2,2,4)
3d_Arr = 1d_Arr.reshape((2,2,4))
步骤3:
进行维度转置。
请注意,它们都与 3d_Arr.shape 的最后一个索引交换了。
row_transpose = 3d_Arr.transpose((2,1,0)).flatten()
col_transpose = 3d_Arr.transpose((0,2,1)).flatten()
depth_transpose = 3d_Arr.transpose((0,1,2)).flatten()
第四步:
使用以下方式打印索引:
# returns where is the element in the array. Such as (2,0,1)
# i: is a value of an array item.
indices = np.where(anArray == i)
# returns the current (some?) linear index for the given indices
linear_idx = np.ravel_multi_index(indices, anArray.shape)
结果:
一维数组(线性):
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
所需输出:
row-transpose-flatten = [ 0 8 4 12 1 9 5 13 2 10 6 14 3 11 7 15]
col-transpose-flatten = [ 0 4 1 5 2 6 3 7 8 12 9 13 10 14 11 15]
depth-transpose-flatten = [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]`
我的策略
深度换位:
元素值 -> 元素索引 -> 元素索引的 ravel_multi_index
0 -> (array([0]), array([0]), array([0])) -> [0]
1 -> (array([0]), array([0]), array([1])) -> [1]
2 -> (array([0]), array([0]), array([2])) -> [2]
3 -> (array([0]), array([0]), array([3])) -> [3]
4 -> (array([0]), array([1]), array([0])) -> [4]
5 -> (array([0]), array([1]), array([1])) -> [5]
6 -> (array([0]), array([1]), array([2])) -> [6]
7 -> (array([0]), array([1]), array([3])) -> [7]
8 -> (array([1]), array([0]), array([0])) -> [8]
9 -> (array([1]), array([0]), array([1])) -> [9]
10 -> (array([1]), array([0]), array([2])) -> [10]
11 -> (array([1]), array([0]), array([3])) -> [11]
12 -> (array([1]), array([1]), array([0])) -> [12]
13 -> (array([1]), array([1]), array([1])) -> [13]
14 -> (array([1]), array([1]), array([2])) -> [14]
15 -> (array([1]), array([1]), array([3])) -> [15]
行转置:
元素值 -> 元素索引 -> 元素索引的 ravel_multi_index
0 -> (array([0]), array([0]), array([0])) -> [0]
1 -> (array([1]), array([0]), array([0])) -> [4]
2 -> (array([2]), array([0]), array([0])) -> [8]
3 -> (array([3]), array([0]), array([0])) -> [12]
4 -> (array([0]), array([1]), array([0])) -> [2]
5 -> (array([1]), array([1]), array([0])) -> [6]
6 -> (array([2]), array([1]), array([0])) -> [10]
7 -> (array([3]), array([1]), array([0])) -> [14]
8 -> (array([0]), array([0]), array([1])) -> [1]
9 -> (array([1]), array([0]), array([1])) -> [5]
10 -> (array([2]), array([0]), array([1])) -> [9]
11 -> (array([3]), array([0]), array([1])) -> [13]
12 -> (array([0]), array([1]), array([1])) -> [3]
13 -> (array([1]), array([1]), array([1])) -> [7]
14 -> (array([2]), array([1]), array([1])) -> [11]
15 -> (array([3]), array([1]), array([1])) -> [15]`
从上面可以看出,flatten()操作的策略是不同的。 Numpy 展平输出模式,我的策略给出了不同的输出。所需的输出是 numpy 展平输出。
问题是 numpy 如何实现这一目标?
您的基本数组,具有正确的名称:
In [827]: Arr1 = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
...: Arr3 = Arr1.reshape((2,2,4))
关键多维信息:
In [828]: Arr3.base, Arr3.shape, Arr3.strides, Arr1.strides
Out[828]:
(array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
(2, 2, 4),
(32, 16, 4),
(4,))
您的转置之一:
In [830]: x=Arr3.transpose((2,1,0)); x.base, x.shape, x.strides
Out[830]:
(array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
(4, 2, 2),
(4, 16, 32))
In [831]: x.reshape(-1)
Out[831]: array([ 0, 8, 4, 12, 1, 9, 5, 13, 2, 10, 6, 14, 3, 11, 7, 15])