2015-05-26 18 views
0

我想向量化NumPy函數polyder,它計算多項式的導數。有沒有簡單的方法或內置函數來做到這一點?如何矢量化NumPy聚合器功能?

使用向量化,我的意思是如果輸入是一個多項式數組,輸出將是具有多項式導數的數組。

一個例子:

p = np.array([[3,4,5], [1,2]]) 

輸出應該像

np.array([[6, 4], [1]]) 
+0

我在所有係數列表具有相同(可能爲0填充)長度的時候增加了一些想法。 – hpaulj

回答

1

由於您的子陣列,輸入和輸出,可以有不同的長度,你最好治療既是名單。

In [97]: [np.polyder(d) for d in [[3,4,5],[1,2]]] 
Out[97]: [array([6, 4]), array([1])] 

p只在一貴(隨時間)的列表array包裝。

In [100]: p=np.array([[3,4,5],[1,2]]) 
In [101]: p 
Out[101]: array([[3, 4, 5], [1, 2]], dtype=object) 

你可以用這樣一個數組做什麼,你不能用列表來完成。做一些時間測試。您可能會發現迭代對象數組的速度比迭代等效列表慢,特別是如果考慮將列表轉換爲數組的時間。

創建這樣的數組也很困難。如果所有子列表長度相同,則結果將是2d數組。強制它們成爲對象數組需要特殊的啓動。

拇指的一般概念是 - 如果單個步驟使用不同長度的數組或列表,則可能無法進行矢量化。也就是說,你不能形成一個矩形二維數組並應用矢量操作。


如果多項式列表都是相同的長度,然後p可能是2D,其結果也可能是:

In [107]: p=np.array([[3,4,5],[0,1,2]]) 

In [108]: p 
Out[108]: 
array([[3, 4, 5], 
     [0, 1, 2]]) 

In [109]: np.array([np.polyder(i) for i in p]) 
Out[109]: 
array([[6, 4], 
     [0, 1]]) 

實際上它是迭代的p行,並且然後將結果重組爲一個數組。有一些簡化迭代的numpy函數(但不要加速太多),但我在這裏看不到那些需要。


尋找在此函數的代碼,其核心是:

p = NX.asarray(p) 
n = len(p) - 1 
y = p[:-1] * NX.arange(n, 0, -1) 

這對於這個2D陣列,(LEN 3)是:

In [117]: p[:,:-1]*np.arange(2,0,-1) 
Out[117]: 
array([[6, 4], 
     [0, 1]]) 

因此,如果數量多項式都是一樣的,這個簡單的乘法給出了一階導數係數。當然,行可以填充,所以他們都是一樣的。所以'矢量化'比我最初想象的要容易。

0
import numpy as np 
p = np.array([[3,4,5], [1,2]]) 
np.array([np.polyder(coefficients) for coefficients in p]) # array([[6 4], [1]], dtype=object) 

將滿足您的具體示例的界面。但是as hpaulj mentions,在這裏使用NumPy數組而不是普通的Python列表是沒有意義的,並且沒有實際的(硬件級別)向量化會發生。(儘管與一般的列表解釋一樣,解釋者可以自由地使用其他並行性手段來計算它們。)