numpy 为什么.重塑(a,B)!= .reshape(B,a).T?

huus2vyu  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(78)

我遇到了这个问题,而扁平化的图像。考虑以下数组

>>> import numpy as np
>>> arr = np.array([[[1, 2],
                     [3, 4]],
                    [[1, 2],
                     [3, 4]]])
>>> arr.shape
(2, 2, 2)

我希望将其重塑为4x2数组**,其中每个垂直切片都是一个扁平图像**。

1.使用.reshape(2, 4).T

这样就达到了预期的效果

>>> arr_flatten = arr.reshape(2, 4).T
>>> arr_flatten
[[1 1]
 [2 2]
 [3 3]
 [4 4]]

2.使用.reshape(4, 2)

这并不能达到预期的效果

>>> arr_flatten = arr.reshape(4, 2)
>>> arr_flatten
[[1 2]
 [3 4]
 [1 2]
 [3 4]]

为什么第二种方法行不通?

iyfjxgzm

iyfjxgzm1#

这两次重塑以不同的方式创建数组。将.reshape(2,4)视为遍历数组,同时计数元素,每次计数到4时,它都会创建一个新行并重新开始计数。所以,括号中的计数,它是1(1),2(2),3(3),4(4)* 新行 * 1(1),2(2),3(3),4(4)。对于.reshape(4,2),它计数到2并开始一个新行。因此,1(1),2(2)* 新行 * 3(1),4(2)* 新行 * 1(1),2(2)* 新行 * 3(1),4(1)。
因此,.reshape(2,4)产生

array([[1, 2, 3, 4],
       [1, 2, 3, 4]])

.reshape(4,2)产生。

array([[1, 2],
       [3, 4],
       [1, 2],
       [3, 4]])

很明显,它们的换位不相等。至于为什么一个人给出了正确的答案,这一切都归结为数据的含义和它是如何排序的。在本例中,由于图像位于轴0上,.reshape(2,4)在创建新行之前遍历整个轴0,因此它给出了正确的结果。

相关问题