2012-10-20 61 views
3

假設你有這樣的數組:問題與numpy的陣列真司

In [29]: a = array([[10, 20, 30, 40, 50], [14, 28, 42, 56, 70], [18, 36, 54, 72, 90]]) 

Out[30]: a 
array([[ 0, 0, 0, 0, 0], 
     [14, 28, 42, 56, 70], 
     [18, 36, 54, 72, 90]]) 

現在由第一個(從未來進口部使用)

In [32]: a[0]/a[2] 
Out[32]: array([ 0.55555556, 0.55555556, 0.55555556, 0.55555556, 0.55555556]) 

現在做分割第三排在一個循環的每一行相同:

In [33]: for i in range(3): 
      print a[i]/a[2] 
[ 0.55555556 0.55555556 0.55555556 0.55555556 0.55555556] 
[ 0.77777778 0.77777778 0.77777778 0.77777778 0.77777778] 
[ 1. 1. 1. 1. 1.] 

一切看起來鑽機H T。但現在,將第一個陣列的[I]/A [2]至[Ⅰ]:

In [35]: for i in range(3): 
      a[i]/=a[2] 
    ....:  

In [36]: a 
Out[36]: 
array([[0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0], 
     [1, 1, 1, 1, 1]]) 

好的,沒有問題。變爲this is by design。相反,我們應該這樣做:

In [38]: for i in range(3): 
      a[i] = a[i]/a[2] 
    ....:  

In [39]: a 
Out[39]: 
array([[0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0], 
     [1, 1, 1, 1, 1]]) 

但這並不奏效。爲什麼以及如何修復它?

在此先感謝。

回答

6

您可以將整個數組轉換爲float陣列第一:

a = a.astype('float') 
a /= a[2] 
+0

謝謝。是的,我考慮過這個問題,但我想知道一個解決方案,因爲它應該作爲一個[i] = a [i]/a [2] –

+0

如果不明顯,這會創建一個新的數組。有沒有辦法(我知道)做到這一點,修改舊的數組,並更改類型。 – mgilson

+0

這是不可能的,因爲舊的和新的類型可能有不同的大小,或者舊的數組可能是一個不應該被修改的其他數組的視圖。 – nneonneo

4

「爲什麼不這項工作」 - 它不工作的原因是因爲numpy的陣列有一個數據類型時,他們」重新創建。任何嘗試將不同類型放入該數組將被轉換爲適當的類型。換句話說,當你嘗試將一個浮點數放到你的整數數組中時,numpy將該浮點數轉換爲一個int值。這背後的原因是因爲numpy數組被設計爲同類型,以便它們具有最佳性能。換句話說,它們以C中的數組形式實現。在C中,不能有一個數組,其中1個元素是float,而下一個是int。 (你可以有struct這樣的行爲,但它們不是數組)。

另一種解決方案(除了由@nneonneo提出的一個)是指定數組從一開始的float數組:

a = array([[10, 20, 30, 40, 50], [14, 28, 42, 56, 70], [18, 36, 54, 72, 90]], dtype=float) 
+0

沒錯。是的,你完全正確,因爲a.dtype返回dtype('int64')然後一旦創建了一個數組,除非明確更改,否則它將保持其數據類型。是嗎? –

+0

@RobertSmith - 無論如何,它都能保持數據類型。你*不能*明確地改變數據類型。做'a.astype(float)'實際上創建了一個* float *類型的新的* ndarray。 – mgilson

+0

哦,明白了。謝謝! –

3

這並不是說是它的問題,分配的劃分,即a[i] = ... (當你做a /= ...時,它也被用在幕後)。試試這個:

>>> a = np.zeros(3, dtype='uint8') 
>>> a[:] = [2, -3, 5.9] 
>>> print a 
[ 2 253 5] 

當你intarray[i] = floatarray[i] numpy的具有截斷浮點值,讓他們融入intarray