2012-10-24 60 views
4

說我做一個古靈精怪的小數組:數組numpy的陣列調整

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

再取一的第一列作爲一個切片:

>>> b = a[:,0] 
>>> b 
array([[1, 2, 3], [4, 5, 6]], dtype=object) 
>>> b.shape 
(2,) 

說我現在要重塑B,使用它的形狀是(2,3):

>>> b.reshape((-1,3)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: total size of new array must be unchanged 

我假定numpy的被處理b中每個陣列作爲一個對象,而不是在其本身的陣列。問題是,是否有一個很好的方法來進行所需的調整大小?

回答

3

在你的具體的例子,你可以使用numpy.vstack:

import numpy as np 


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

c = np.vstack(b) 
print c.shape # (2,3) 

編輯:由於您的陣列a是不是一個真正的矩陣,但陣列的集合(如指出的WIM),你可以還請執行以下操作:

b = np.array([ line for line in a[:,0]]) 
    print b.shape #(2,3) 
2

您無法在適當的位置更改b的形狀,但您可以使用np.vstack(b)創建所需形狀的副本。我想你可能已經知道了這一點。

請注意,如果您在檢查type(a[0,0])時,您並未在第一列a中創建數組,您將看到您實際上有一個列表。即您的切片a[:,0]實際上是兩個列表對象的列向量,它本身不是(也不是)數組。

+0

說得沒錯。但是,將數組放在[0,0]中並沒有什麼區別。 a [:,0]切片的結果仍返回一個對象數組。使用vstack確實可以做到這一點。 Upvote for you並接受georgesl立即指出vstack之後所需的結果形狀(這正是我所尋找的)。 –