2017-03-15 34 views
0

我有一個代碼如下:NumPy的不能識別孔陣列形狀

data = np.array([[[i, j], i * j] for i in range(10) for j in range(10)]) 
print(data) 

x = np.array(data[:,0]) 
x1 = x[:,0] 
x2 = x[:,1] 
print(x) 

data正確輸出[[[0,0],0],[[0,1],0],[[0,2],0],...,[[9,9],81]]其是,順便說一下,乘法表和它的結果。

所以,data的第一列(這是x)必須被分離成x1x2,分別是它的第一個和最後一列。我認爲我做對了,但它提出了一個錯誤,說too many indices for array。我究竟做錯了什麼?

+1

'np.array(數據[:,0])'不改變D型細胞(如停留1D的對象數組)。修復:'np.vstack(data [:,0])'可以被使用。 – Divakar

+0

錯誤是這麼說的,因爲在'x1 = x [:,0]'行中,你調用一個不存在的軸的索引,就像調用'x.shape'時看到的那樣(這給出'(100,)' )。你也可以在調用'x'時看到'dtype = object'。我想這是你預期不同的兩件事。 – Michael

回答

1

data.dtypeobject,因爲[[i,j],k]的元素不均勻。一種解決方法你:

data = np.array([(i, j, i * j) for i in range(10) for j in range(10)]) 
print(data) 

x1 = data[:,:2] 
x2 = data[:,2] 

data.shape現在是(100,3)data.dtypeintx1x2你想要什麼。

1

因爲列表長度的混合物,這將產生一個對象數組:

In [97]: data = np.array([[[i, j], i * j] for i in range(3) for j in range(3)]) 
In [98]: data 
Out[98]: 
array([[[0, 0], 0], 
     [[0, 1], 0], 
     [[0, 2], 0], 
     [[1, 0], 0], 
     [[1, 1], 1], 
     [[1, 2], 2], 
     [[2, 0], 0], 
     [[2, 1], 2], 
     [[2, 2], 4]], dtype=object) 
In [99]: data.shape 
Out[99]: (9, 2) 

一列包含數字(但仍是對象D型),其他列表。兩者都具有(9)形狀

In [100]: data[:,1] 
Out[100]: array([0, 0, 0, 0, 1, 2, 0, 2, 4], dtype=object) 
In [101]: data[:,0] 
Out[101]: 
array([[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], 
     [2, 2]], dtype=object) 

轉動該列到數值陣列的最簡單的方法是通過.tolist

In [104]: np.array(data[:,0].tolist()) 
Out[104]: 
array([[0, 0], 
     [0, 1], 
     [0, 2], 
     [1, 0], 
     [1, 1], 
     [1, 2], 
     [2, 0], 
     [2, 1], 
     [2, 2]]) 
In [105]: _.shape 
Out[105]: (9, 2) 

[i, j, i * j]元件所建議在對方的回答是容易的工作。


的結構化陣列的方法來產生這樣的 '表':

In [113]: dt='(2)int,int' 
In [114]: data = np.array([([i, j], i * j) for i in range(3) for j in range(3)], 
    ...: dtype=dt) 
In [115]: data 
Out[115]: 
array([([0, 0], 0), ([0, 1], 0), ([0, 2], 0), ([1, 0], 0), ([1, 1], 1), 
     ([1, 2], 2), ([2, 0], 0), ([2, 1], 2), ([2, 2], 4)], 
     dtype=[('f0', '<i4', (2,)), ('f1', '<i4')]) 
In [116]: data['f0'] 
Out[116]: 
array([[0, 0], 
     [0, 1], 
     [0, 2], 
     [1, 0], 
     [1, 1], 
     [1, 2], 
     [2, 0], 
     [2, 1], 
     [2, 2]]) 
In [117]: data['f1'] 
Out[117]: array([0, 0, 0, 0, 1, 2, 0, 2, 4])