2017-11-25 78 views
2

的“相同”的部分我考虑一个numpy的数组:不同形状的ndarray

import numpy as np 
b = np.empty((10,11,12)) 

现在我希望下面的形状是相同的,但他们显然不是:

>>> b[0,:,1].shape 
>>> (11,) 

>>> b[0][:][1].shape 
>>> (12,) 

有人可以给我解释为什么形状不同?我阅读了关于编制索引的Numpy文档,但是它表示编写a[k][l]a[k,l]相同。

+0

但是,这并不适用于带':'的'[:]'或表达式。 – hpaulj

+0

在第二步中,评估'temp = b [0]'。然后'temp1 = temp [:]',然后'temp1 [1]'。也就是说,单独的索引操作。 'b [0,:,1]'是一个索引操作,通过'numpy'作为一个整体进行评估。尝试匹配这两个操作并不总是有用。 – hpaulj

回答

4

发生这种情况是因为b[0][:]b[0]的视图,因此b[0][:][1]确实是b[0, 1, :]。一个数字例子可能有助于突出显示发生了什么:

In [5]: b = np.arange(3*4*5).reshape((3, 4, 5)) 

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

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

In [8]: b[0, :, 1] 
Out[8]: array([ 1, 6, 11, 16]) 

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

In [11]: b[0][:][1] 
Out[11]: array([5, 6, 7, 8, 9]) 

In [13]: b[0, 1, :] 
Out[13]: array([5, 6, 7, 8, 9]) 

In [32]: b[0][:, 1] 
Out[32]: array([ 1, 6, 11, 16]) 
+0

我想我现在明白了。 [:]给出数组的一个副本,但以这种方式使用它:b [0,:,1]表示在第一维中选择第0个位置,在第二个维中选择第一个位置,在第三个维中选择第一个位置,对? – user9007131

+0

除了一个普通的gotcha:与Python列表不同的是,'':''不会*浅拷贝'np.ndarray';相反,它给你一个原始数组的视图:如果让'c = b [:]'并更改'c'的任何部分,那么'b'引用的内容也会改变。 – fuglede

+0

那么当处理numpy数组时,什么是[:]呢?我可以忽略它,并总是在上面的例子中得到相同的结果。 – user9007131