2012-12-05 77 views
61

說我有一個數組a從ND至1D陣列

a = np.array([[1,2,3], [4,5,6]]) 

array([[1, 2, 3], 
     [4, 5, 6]]) 

我想將其轉換爲一維數組(即列矢量):

b = np.reshape(a, (1,np.product(a.shape))) 

但這返回

array([[1, 2, 3, 4, 5, 6]]) 

這是不一樣:

array([1, 2, 3, 4, 5, 6]) 

我可以利用這個陣列的第一個元素,以手動將其轉換爲一維數組:

b = np.reshape(a, (1,np.product(a.shape)))[0] 

但這需要我知道原始陣列多少維度具有(並連接[0]」 s在更高維度工作時)

是否存在與任意ndarray中的列/行向量無關的維度獨立方式?

回答

130

使用np.ravel(對於一維視圖)或np.flatten(對於一維複印件)或np.flat(對於1D迭代器):

In [12]: a = np.array([[1,2,3], [4,5,6]]) 

In [13]: b = a.ravel() 

In [14]: b 
Out[14]: array([1, 2, 3, 4, 5, 6]) 

注意ravel()返回a一個view在可能的情況。因此修改b也會修改a。當1D元素在存儲器中連續時,返回view,但是如果例如a是通過使用非單位步長(例如a = x[::2])切片另一個陣列而產生的,則返回copy

如果你想有一個副本,而不是一個視圖,使用

In [15]: c = a.flatten() 

如果你只是想要一個迭代器,使用np.flat

In [20]: d = a.flat 

In [21]: d 
Out[21]: <numpy.flatiter object at 0x8ec2068> 

In [22]: list(d) 
Out[22]: [1, 2, 3, 4, 5, 6] 
+1

在這個例子中le,'ravel()'返回一個視圖,但並非總是如此。有些情況下'ravel()'返回一個副本。

+0

@WarrenWeckesser:的確如此。感謝您指出了這一點。 – unutbu

13
In [14]: b = np.reshape(a, (np.product(a.shape),)) 

In [15]: b 
Out[15]: array([1, 2, 3, 4, 5, 6]) 

,或者乾脆:

In [16]: a.flatten() 
Out[16]: array([1, 2, 3, 4, 5, 6]) 
+2

在第一個例子中可以使用'b = a.reshape(-1)'。 –