2012-09-06 221 views
2

我需要大的幫助,請看看這個代碼:轉換陣列蟒蛇標

import.math 

dose =20.0 
a = [[[2,3,4],[5,8,9],[12,56,32]] 
    [[25,36,45][21,65,987][21,58,89]] 
    [[78,21,98],[54,36,78],[23,12,36]]] 
PAC = math.exp(-dose*a) 

這一點,我想怎麼辦。但是如果你想在陣列(無論其尺寸...)進行數學運算,你真的應該考慮使用NumPy這是剛剛爲設計的,我得到的錯誤是

TypeError: only length-1 arrays can be converted to Python scalars 
+2

您的預期產量是多少? –

+0

我的預期是與 – CharlieShe

回答

13

。在你的情況,相應的NumPy的命令是:

PAC = numpy.exp(-dose*np.array(a)) 

如果NumPy的是不是一種選擇,你必須循環的a每個元素,計算你math.exp,結果存儲在一個列表...真是麻煩而且效率低下。這是因爲當你傳遞一個列表(列表)時,math函數需要一個標量作爲輸入(正如例外告訴你的那樣)。您可以將所有的循環中的一個列表理解,雖然:

PAC = [[[math.exp(-dose*j) for j in elem] for elem in row] for row in a] 

但再次,我會強烈建議NumPy的。

+0

Perfect形狀相同:) :) – CharlieShe

0

如果你想,數組中的每個元素要把它乘以-dose然後對結果應用math.exp,你需要一個循環:

new_a = [] 
for subarray in a: 
    new_sub_array = [] 
    for element in sub_array: 
     new_element = math.exp(-dose*element) 
     new_sub_array.append(new_element) 
    new_a.append(new_sub_array) 

Alternatvely,如果你有一個mathlab背景,你可以查詢numpy,啓用陣列轉換。

+0

你知道枚舉嗎?它比追加到new_a []更快... – Oz123

+0

我這樣做主要是爲了可讀性。 OP看起來相當不錯(python)初學者。此外,在適當的位置變換很容易,你會丟失原始數組,這在處理編碼時通常是不理想的。 – LBarret

+0

我也發佈瞭如何保留列表的副本。迭代列表時使用append是一種不好的樣式恕我直言。另外,它遍佈整個網絡,然後在編程之後,你問自己:等待如何迭代和更改值。因爲我們已經發現了。 OP就是這樣問的,如何改變這些值。 – Oz123

2

你應該真的使用NumPy。 這裏是你應該如何使用嵌套循環做到這一點:

>>> for item in a: 
...  for sub in item: 
...   for idx, number in enumerate(sub): 
...    print number, math.exp(-dose*number) 
...    sub[idx] = math.exp(-dose*number) 

使用append是緩慢的,因爲每次你複製前一陣和堆棧新項目給它。 使用枚舉,就地更改數字。如果你想保留的副本,這樣做:

acopy = a[:] 

如果你沒有太多的數字,NumPy的是一個超必殺,上面可以一點點更快完成應用列表解析。