2015-04-02 30 views
5

我有一个numpy的阵列数据:numpy整形如何工作?

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

当I型

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我得到的值如[: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

你想要一个矩阵,10行,数字从0到50?但这就是重塑... b.reshape((20,5))[:10] – 2015-04-02 14:10:06

+0

你确定'b'看起来像这样吗?我得到了不同的东西......我认为你有'b = a.reshape(10,2,5)' – plonser 2015-04-02 14:10:07

+0

'b'看起来像一个'(10,2,5)'重塑 – hpaulj 2015-04-02 14:16:48

回答

6

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

+0

有没有办法切片B为了得到[:10]? – dnth 2015-04-02 14:23:27

+1

您的'b'阵列被分成5块,每块4行,5列。您需要前两个块中的所有条目和第三个前两个行中的所有条目。我不认为有一种简单的方法可以将这个分割成单个10x5阵列而不需要重新塑造。从某种意义上说,重塑只是改变了索引内存的方式,所以对于你的情况来说,它是一种额外的工具,可以按你想要的方式进行切片。这并不慢。 – xnx 2015-04-02 14:35:36

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]