从ND到1Darrays

说我有一个数组:

 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] 

但是这要求我知道原始数组有多less个维度(并且在处理更高维度时连接[0])

有没有一个维度独立的方式从任意的ndarray获取列/行向量?

使用np.ravel (用于一维视图)或np.flatten (用于一维副本)或np.flat (用于一维迭代器):

 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()返回可能的view 。 所以修改b也会修改a 。 当一维元素在内存中是连续的时候, ravel()返回一个view ,但是如果使用非单位步长(例如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] 
 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])