2012-12-05 45 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)'。 –