的“相同”的部分我考虑一个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]
相同。
的“相同”的部分我考虑一个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]
相同。
发生这种情况是因为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])
我想我现在明白了。 [:]给出数组的一个副本,但以这种方式使用它:b [0,:,1]表示在第一维中选择第0个位置,在第二个维中选择第一个位置,在第三个维中选择第一个位置,对? – user9007131
除了一个普通的gotcha:与Python列表不同的是,'':''不会*浅拷贝'np.ndarray';相反,它给你一个原始数组的视图:如果让'c = b [:]'并更改'c'的任何部分,那么'b'引用的内容也会改变。 – fuglede
那么当处理numpy数组时,什么是[:]呢?我可以忽略它,并总是在上面的例子中得到相同的结果。 – user9007131
但是,这并不适用于带':'的'[:]'或表达式。 – hpaulj
在第二步中,评估'temp = b [0]'。然后'temp1 = temp [:]',然后'temp1 [1]'。也就是说,单独的索引操作。 'b [0,:,1]'是一个索引操作,通过'numpy'作为一个整体进行评估。尝试匹配这两个操作并不总是有用。 – hpaulj