【问题标题】:How does numpy reshape works?numpy 重塑如何工作?
【发布时间】:2015-04-02 13:54:07
【问题描述】:

我在一个 numpy 数组中有数据:

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]])

但它不正确。 提前谢谢!

【问题讨论】:

  • 您想要一个包含 0 到 50 数字的 10 行矩阵?但这就是 reshape 的用途... b.reshape((20,5))[:10]
  • 你确定b 看起来像这样吗?我得到了一些不同的东西......我认为你有 b = a.reshape(10,2,5)
  • b 看起来像 (10,2,5) 重塑
  • 试试b[:,:2,:];但可以肯定的是,我会在我的电脑上使用 numpy。您想要的东西有些混乱。
  • 对不起,我已经编辑了问题

标签: python arrays numpy


【解决方案1】:

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

【讨论】:

  • 有没有办法对 b 进行切片以获得 a[:10]?
  • 您的b 数组分为5 个4 行5 列的块。您想要前 2 个块中的所有条目和第三个块中的前 2 行。我认为没有一种简单的方法可以将其切片以获得单个 10x5 数组而无需重新整形。从某种意义上说,重塑只是改变了你索引内存的方式,所以对于你的情况,它是一个额外的工具,可以按照你想要的方式进行切片。它并不慢。
【解决方案2】:

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

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 行。c[:2].reshape(10,-1) 看起来就像 a[:10]

【讨论】:

    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多