2017-04-22 254 views
0

我的目標是要做到這一點:如何將numpy數組的dtype更改爲'object'?

weights[1][0][0] = some_object(1) 

但它拋出這個錯誤:

TypeError: float() argument must be a string or a number, not 'some_object' 

正因爲如此我wawnt到D型更改爲「對象」 在我的代碼有重量。他們是這樣的:

>>> print(weights) 
[ array([[-2.66665269, 0.  ], 
    [-0.36358187, 0.  ], 
    [ 1.55058871, 0.  ], 
    [ 3.91364328, 0.  ]]) 
    array([[ 0.], 
    [ 0.]])] 

我想改變weights[1][0][0]的對象。我指的0:

[ array([[-2.66665269, 0.  ], 
    [-0.36358187, 0.  ], 
    [ 1.55058871, 0.  ], 
    [ 3.91364328, 0.  ]]) 
    array([[ 0.],      #this zero right here 
    [ 0.]])] 

我要轉換的是0到some_object(1)。所以我把dtype改成'object',但它仍然是浮動的!

>>> weights=np.array(weights,dtype='object') 
>>> weights.dtype 
object 
>>> weights[1].dtype 
float64 
>>> weights[1][0].dtype 
float64 
>>> weights[1][0][0].dtype 
float64 

所以現在我嘗試:

>>> weights[1].dtype='object' 
TypeError: Cannot change data-type for object array. 

>>> weights[1][0].dtype='object' 
TypeError: Cannot change data-type for object array. 

所以現在我不能做到這一點:

weights[1][0][0] = some_object(1) 
TypeError: float() argument must be a string or a number, not 'object' 

因爲D型不正確。如何更改dtype?

編輯:我找到了答案。

weights[1] = weights[1].tolist() 
weights[1][0][0] = some_object(1) 
.... 
weights=np.array(weights) 

回答

2

讓我們確保我們理解你開始使用什麼:

In [7]: weights 
Out[7]: 
[array([[-2.66665269, 0.  ], 
     [-0.36358187, 0.  ], 
     [ 1.55058871, 0.  ], 
     [ 3.91364328, 0.  ]]), array([[ 0.], 
     [ 0.]])] 
In [8]: len(weights) 
Out[8]: 2 
In [9]: weights[0] 
Out[9]: 
array([[-2.66665269, 0.  ], 
     [-0.36358187, 0.  ], 
     [ 1.55058871, 0.  ], 
     [ 3.91364328, 0.  ]]) 
In [10]: weights[0].dtype 
Out[10]: dtype('float64') 
In [11]: weights[0].shape 
Out[11]: (4, 2) 

In [13]: weights[1] 
Out[13]: 
array([[ 0.], 
     [ 0.]]) 
In [14]: weights[1].dtype 
Out[14]: dtype('float64') 
In [15]: weights[1].shape 
Out[15]: (2, 1) 

這是一個2項列表,包含兩個數組。兩者都是2D浮法。

首先,整個包住列表的對象陣列中:

In [16]: duh =np.array(weights,dtype='object') 
In [17]: duh 
Out[17]: 
array([ array([[-2.66665269, 0.  ], 
     [-0.36358187, 0.  ], 
     [ 1.55058871, 0.  ], 
     [ 3.91364328, 0.  ]]), 
     array([[ 0.], 
     [ 0.]])], dtype=object) 

這是一個2元件陣列,形狀(2)。但它不會改變元素的性質。還有一個潛在的問題 - 如果元素數組具有相同的形狀,它將創建一個3d數組對象。

這不是改變數組的dtype的正確語法。 dtype不是可寫屬性/屬性。

weights[1].dtype='object' 

我們可以用astype代替:

In [19]: weights[1].astype(object) 
Out[19]: 
array([[0.0], 
     [0.0]], dtype=object) 
In [20]: weights[1]=weights[1].astype(object) 
In [21]: weights 
Out[21]: 
[array([[-2.66665269, 0.  ], 
     [-0.36358187, 0.  ], 
     [ 1.55058871, 0.  ], 
     [ 3.91364328, 0.  ]]), array([[0.0], 
     [0.0]], dtype=object)] 

它使一個新的陣列,這是我們不得不寫回原來的名單。現在

在玩這樣的遊戲,你必須要注意,你必須陣列和在那裏他們列出我可以改變第二陣列

In [22]: weights[1][0,0]=None 
In [23]: weights 
Out[23]: 
[array([[-2.66665269, 0.  ], 
     [-0.36358187, 0.  ], 
     [ 1.55058871, 0.  ], 
     [ 3.91364328, 0.  ]]), array([[None], 
     [0.0]], dtype=object)] 

的元素。並注意陣列的形狀和dtype。不要盲目索引,並希望最好的。顯示/打印這些屬性,或整個數組,如果它不是太大。

+0

輝煌。這工作。 –

相關問題