numpy 麻木重塑是如何运作的?

s4n0splo  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(119)

我有一个数字数组中的数据:

a = np.arange(100)
a = a.reshape((20,5))

当我打字时

a[:10]

它又回来了

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34],
       [35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44],
       [45, 46, 47, 48, 49]])

现在我决定将阵列重塑为3D阵列。

b = a.reshape((5,4,5))

array([[[ 0,  1,  2,  3,  4],
    [ 5,  6,  7,  8,  9],
    [10, 11, 12, 13, 14],
    [15, 16, 17, 18, 19]],

   [[20, 21, 22, 23, 24],
    [25, 26, 27, 28, 29],
    [30, 31, 32, 33, 34],
    [35, 36, 37, 38, 39]],

   [[40, 41, 42, 43, 44],
    [45, 46, 47, 48, 49],
    [50, 51, 52, 53, 54],
    [55, 56, 57, 58, 59]],

   [[60, 61, 62, 63, 64],
    [65, 66, 67, 68, 69],
    [70, 71, 72, 73, 74],
    [75, 76, 77, 78, 79]],

   [[80, 81, 82, 83, 84],
    [85, 86, 87, 88, 89],
    [90, 91, 92, 93, 94],
    [95, 96, 97, 98, 99]]])

如何将b分成像a[:10]这样的值?我试过了

b[:10,0,:5]
array([[ 0,  1,  2,  3,  4],
       [10, 11, 12, 13, 14],
       [20, 21, 22, 23, 24],
       [30, 31, 32, 33, 34],
       [40, 41, 42, 43, 44],
       [50, 51, 52, 53, 54],
       [60, 61, 62, 63, 64],
       [70, 71, 72, 73, 74],
       [80, 81, 82, 83, 84],
       [90, 91, 92, 93, 94]])

但这是不正确的。提前谢谢您!

wn9m85ua

wn9m85ua1#

当您使用b = a.reshape((5,4,5))时,您只需在数组a使用的相同数据上创建一个不同的视图。(即对a的元素的更改将出现在b中)。在这种情况下,reshape()不复制数据,因此它是一个非常快的操作。切片b和切片a访问相同的内存,因此不需要为b数组使用任何不同的语法(只需使用a[:10])。如果您已经创建了数据的副本(可能使用np.resize())并丢弃了a,那么只需重塑bb.reshape((20,5))[:10]即可。

gcmastyq

gcmastyq2#

通过将(20,5)重塑为(5,4,5),您无法提取前一半的值。您不能将这些5行拆分为两个偶数组:

In [9]: b[:2]
Out[9]: 
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],

       [[20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39]]])

In [10]: b[:3]
Out[10]: 
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],

       [[20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39]],

       [[40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]]])

最后一行a[:10]b[3,:,:]的中间。
请注意,b[:2](2,4,5),8行a,分组为2组4。
现在,如果你做了c=a.reshape(4,5,5),那么c[:2]会有同样的10行-在2组5行中。

rkkpypqq

rkkpypqq3#

可能会有一种编程方法来获得您想要的东西,但不是一片巨蟒。
重要的是要理解形状中的每个组件告诉我们关于排列的信息。我喜欢用向量来思考。
让我们来讨论形状(20, 5),这意味着,我有20个向量,每个向量有5个元素。
对于形状(5, 4, 5)-这意味着,我有5个向量,其中每个向量又有4个向量,其中每个向量有5个元素。
这听起来可能很复杂,但经过深思熟虑,这是可以理解的。
对于您的问题,通过a[:10],您希望检索前10行,其中每一行都应该是一个包含5个元素的向量,但使用的是(5, 4, 5)的形状。只有从最左边的第一个向量(5)中检索前4个向量,从下一个向量中检索下4个向量,从第三个向量中检索下一个2,才有可能做到这一点。
Python切片可能不是实现这一点的最佳工具。

相关问题