2017-07-17 58 views
0

建立的元組數組作爲元素

x = np.arange(0, 4, 1) 
y = np.arange(0, 4, 1) 

,我想

array([[(0,0), (0,1), (0,2), (0,3)], 
     [(1,0), (1,1), (1,2), (1,3)], 
     [(2,0), (2,1), (2,2), (2,3)], 
     [(3,0), (3,1), (3,2), (3,3)] 
     ]) 

請注意,我要對最低級別的元組!這不是一個3級的數組!這是一個以元組爲元素的2級數組!

的數字0〜3只是一個例子。在實際情況下,它將是花車。從那以後,我想用這些浮元組作爲參數,它產生替換對象的元組對象的工廠函數。

現在的問題是:如何獲得這個數組元組的?

我看着in Numpy, how to zip two 2-D arrays?但這並沒有工作,因爲我的評論顯示。

+0

@ inspectorG4dget:請仔細閱讀我的問題!我補充了一點,其中的區別在於所假設的重複問題。請取消標記問題。 – Make42

+0

你可以在每個元素上調用'tuple(...)'。兩個問題的計算方面(你正在尋找一個笛卡爾積)是非常相似的,我仍然認爲這兩個帖子是重複的。如果你還有其他感覺,那麼請標誌主持人的注意力,這樣比我更聰明的人可以在這裏權衡 – inspectorG4dget

+0

在轉換成數組之後,你不能在每個元素上調用'tuple(...)',因爲信息,什麼元素被(元組)丟失了。 – Make42

回答

3

array of tuples可以有幾個含義。

雙迭代產生的元組的嵌套列表:

In [292]: alist = [[(i,j) for j in y] for i in x] 
In [293]: alist 
Out[293]: 
[[(0, 0), (0, 1), (0, 2), (0, 3)], 
[(1, 0), (1, 1), (1, 2), (1, 3)], 
[(2, 0), (2, 1), (2, 2), (2, 3)], 
[(3, 0), (3, 1), (3, 2), (3, 3)]] 

從此形成陣列的默認方式產生含有一個三維陣列整數元素

In [294]: arr=np.array(alist) 
In [295]: arr.dtype 
Out[295]: dtype('int32') 
In [296]: arr.shape 
Out[296]: (4, 4, 2) 
In [297]: arr[0,0] 
Out[297]: array([0, 0]) 

定義的化合物D型創建一個結構化陣列:

In [298]: arr=np.array(alist,'i,i') 
In [299]: arr.dtype 
Out[299]: dtype([('f0', '<i4'), ('f1', '<i4')]) 
In [300]: arr.shape 
Out[300]: (4, 4) 
In [301]: arr 
Out[301]: 
array([[(0, 0), (0, 1), (0, 2), (0, 3)], 
     [(1, 0), (1, 1), (1, 2), (1, 3)], 
     [(2, 0), (2, 1), (2, 2), (2, 3)], 
     [(3, 0), (3, 1), (3, 2), (3, 3)]], 
     dtype=[('f0', '<i4'), ('f1', '<i4')]) 

arr.tolist()看起來就像alist

這種陣列的一個元素不是一個元組,但它確實顯示爲這樣。我更喜歡稱它爲一個記錄。

In [303]: type(arr[0,0]) 
Out[303]: numpy.void 
In [304]: arr[0,0] 
Out[304]: (0, 0) 

這些記錄的2個元素是字段,可以通過名稱來訪問,例如, arr['f0'], arr['f1'],它們都是2d整型數組。

,能夠創建一個對象陣列,它可以包含文字的元組(實際上指針到元組別處存儲:

In [305]: arr = np.empty((4,4),object) 
In [306]: arr 
Out[306]: 
array([[None, None, None, None], 
     [None, None, None, None], 
     [None, None, None, None], 
     [None, None, None, None]], dtype=object) 
In [307]: arr[...]=alist 
In [308]: arr 
Out[308]: 
array([[(0, 0), (0, 1), (0, 2), (0, 3)], 
     [(1, 0), (1, 1), (1, 2), (1, 3)], 
     [(2, 0), (2, 1), (2, 2), (2, 3)], 
     [(3, 0), (3, 1), (3, 2), (3, 3)]], dtype=object) 
In [309]: type(arr[0,0]) 
Out[309]: tuple 

從這些X,Y構成的陣列的非迭代的方式變量是meshgrid,它返回(4,4)數組的列表。

In [322]: I,J = np.meshgrid(x,y,indexing='ij') 
In [323]: np.allclose(np.stack((I,J),axis=2), np.array(alist)) 
Out[323]: True 

我們可以從這些以及構建記錄陣列:在該(4,4,2)陣列相匹配的方式,他們可以「堆疊」

In [327]: arr = np.zeros((4,4),'i,i') 
In [328]: arr['f0']=I 
In [329]: arr['f1']=J 
1

一種選擇是。

M = np.asarray([[(i,j) for j in y] for i in x], dtype='int,int') 
+0

然後呢?我想獲得一個numpy數組。 – Make42

+0

我編輯過,請檢查。 – VIX

+0

感謝您嘗試:-)!試試你的命令,看看這是否是我要求的結果(不是)。 – Make42

0

通過https://stackoverflow.com/a/17960617/4533188啓發,似乎導致

array([[(0, 0), (0, 1), (0, 2), (0, 3)], 
     [(1, 0), (1, 1), (1, 2), (1, 3)], 
     [(2, 0), (2, 1), (2, 2), (2, 3)], 
     [(3, 0), (3, 1), (3, 2), (3, 3)]], 
     dtype=[('f0', '<i4'), ('f1', '<i4')]) 
xx, yy = np.meshgrid(x,y) 
np.array(list(zip(yy.ravel(), xx.ravel())), dtype=('i4,i4')).reshape(xx.shape) 

也是一個答案。