2012-07-19 71 views
1

低和看,我升級到1.5.1後遇到numpy.choose迴歸。據我所知,過去的版本(和數字)支持一個無限數量的潛在選擇。 「新」選擇限於32. Here is a post其中一位用戶對迴歸感到悲嘆。numpy.choose 32選擇限制

我有一個包含100個選項(0-99)的列表,用於修改數組。作爲解決方法,我使用下面的代碼。可以理解的是,它比使用選擇慢7倍。我不是C程序員,雖然我想解決這個問題,但我想知道還有其他可能更快的解決方法。思考?

d={...} #A dictionary with my keys and their new mappings 
for key, value in d.iteritems(): 
    array[array==key]=value 
+0

我是否正確理解'd'的鍵是數字0到99? – 2012-07-19 22:22:28

+0

是的。 d是數字。 – Jzl5325 2012-07-19 22:30:55

回答

1

我推測,d有鑰匙099。在這種情況下,解決方案非常簡單。首先,將d的值寫入NumPy數組values,方法d[i] == values[i] - 無論如何,這似乎是這些值的自然數據結構。然後,你可以通過

values[array] 

如果要修改array到位,簡單地做

array[:] = values[array] 
+0

什麼是數組[:]功能稱爲?我想更詳細地瞭解numpy文檔中發生的情況。 – Jzl5325 2012-07-19 23:49:13

+0

@ Jzl5325:這是切片整個陣列。它實際上不是NumPy特有的,而是一般的Python。檢查官方的Python教程,它解釋了切片的工作原理。 – 2012-07-19 23:53:36

+0

Gotcha。我之前沒有使用[:],但可以看到很多用途。 =語法是拋出我的東西(儘管它工作得很好)。我們不是分配變量,而是通過=來運行if語句。它讀取「如果輸入數組中的值等於values數組中的索引,則用數值編號替換輸入數組編號」?謝謝! – Jzl5325 2012-07-20 03:08:45

0

我不知道高效地訪問與替換值新的陣列,它不是就地(NB:我不經常使用numpy - 所以有點生鏽):

import numpy as np 

d = {0: 5, 1: 3, 2: 20} 
data = np.array([[1, 0, 2], [2, 1, 1], [1, 0, 1]]) 
new_data = np.array([d.get(i, i) for i in data.flat]).reshape(data.shape) # adapt for list/other 
+0

NumPy的全部意義在於避免Python循環轉而使用C語言實現的隱式循環。這個代碼迭代了單一值,所以它肯定不是很快。 – 2012-07-19 23:33:13

+0

@SvenMarnach我知道numpy是如何工作的。 '.flat'是低層次的,從列表中產生的數組是低層次的,重新構造並不複雜,因此,作爲一個kludge,它可能並不是最差的。在33種選擇中,它也可以無限加快:) – 2012-07-19 23:38:24

+0

如果數組巨大,即使有33種選擇,它也可能比原始代碼慢。 – 2012-07-19 23:50:42