2011-08-28 87 views
0

也許這是一個簡單的問題,但到目前爲止我還找不到任何有關它的信息。 對於numpy中的優化,我需要一組函數。我需要的功能數量取決於當前應優化的對象。 我已經想通了如何動態地實現這些功能,但現在我想將它們存儲在一個這樣的數組:Python:將函數添加到FOR循環中的數組中

myArray = zeros(x) 
for i in range(x): 
    myArray[i] = createFunction(i) 

如果我運行此我得到一個類型不匹配: 浮動()參數必須是一個字符串或數字,而不是「功能」

直接創建數組工作得很好:

myArray = array([createFunction(0)...]) 

但因爲我不知道我需要的功能數量,這正是我想要避免。

+1

createFucntion代碼是什麼樣子的? – JeremyFromEarth

回答

1

也許你可以使用

myArray = array([createFunction(i) for i in range(x)]) 
2

啊,我明白了。你真的意味着一組函數

類型不匹配錯誤的出現是因爲zeros的調用默認創建了一個浮點數組。所以你的原創會工作,而不是你做myArray = numpy.empty(x, dtype=numpy.object)(請注意empty在這裏比zeros更有意義)。稍微更Python版本是使用列表理解

myArray = numpy.array([createFunction(i) for i in range(x)]). 

但你可能不需要再創建一個numpy的陣列,這取決於你想用它做什麼:

myArray = [createFunction(i) for i in range(x)] 

如果您要避免列表中,它可能是最好使用numpy.fromfunctionnumpy.vectorize一起:

myArray = numpy.fromfunction(numpy.vectorize(createFunction), 
          shape=(x,), dtype=numpy.object) 

其中(x,)是一個元組賦予形狀的陣列。 vectorize的調用是必需的,因爲fromfunction假定該函數可以在輸入數組上工作並返回一個標量數組,並且vectorize將函數轉換爲完成該操作。需要dtype=object,否則numpy會嘗試創建一個浮點數組。

1

如果您需要一組函數,是否有可能使用NumPy?而不是? NumPy數組具有C風格類型,並且它默認爲浮動。如果可以,只需使用標準的Python列表。但是,如果你絕對必須使用NumPy的,嘗試定義,像這樣的數組:

import numpy as np 
a = np.empty([x], dtype=np.dtype(np.object_)) 

或者不過你需要它與dtype

1

Numpy陣列是均勻的。這就是numpy數組的所有元素都是相同的類型 - python是duck-typed,numpy不是。這是在numpy數組和矩陣上如此快速地進行矩陣運算的一部分。但是,正因爲如此,數組首次創建時必須知道數據類型。 Numpy通常非常擅長推斷數據類型。創建空或歸零數組時會出現問題。由於沒有檢查numpy的元素,所以必須猜測數據類型。如果數組創建時未給定數據類型,則Numpy默認爲numpy.float64。這是一個不錯的選擇,因爲numpy通常用於需要浮點數的科學或工程領域。這也是numpy抱怨的原因 - 因爲它不能將你的函數存儲爲64位浮點數。

快速解決方案是讓numpy知道你想要的數據類型。例如。

myArray = numpy.zeros(x, dtype=numpy.object) 

注意,數據類型不能爲任何一類,但必須numpy.dtype的一個實例(高級應用可以創建其他dtypes一個運行時numpy的可然後操縱)。對於函數,numpy會將它們存儲爲numpy.object(這意味着任何通用的python對象)。我不認爲使用numpy存儲函數數組會獲得任何性能優勢。也許你會更好地創建生成器函數並鏈接它們,一旦知道結果將是一個數字,就轉換爲一個numpy數組。

funcs = [createFunction(i) for i in xrange(x)] 

def getItemFromEachFunction(i): 
    return funcs[i]() 

arr = numpy.fromfunction(getItemFromEachFunction, (x,)) 
相關問題