numpy.flatten() 在 numpy.transform 上使用什么数学或记忆技巧?

问题描述 投票:0回答:1

我正在尝试复制 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 如何实现这一目标?

numpy multidimensional-array linear-algebra transpose
1个回答
0
投票

您的基本数组,具有正确的名称:

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])
© www.soinside.com 2019 - 2024. All rights reserved.