我想向量化NumPy函數polyder
,它計算多項式的導數。有沒有簡單的方法或內置函數來做到這一點?如何矢量化NumPy聚合器功能?
使用向量化,我的意思是如果輸入是一個多項式數組,輸出將是具有多項式導數的數組。
一個例子:
p = np.array([[3,4,5], [1,2]])
輸出應該像
np.array([[6, 4], [1]])
我想向量化NumPy函數polyder
,它計算多項式的導數。有沒有簡單的方法或內置函數來做到這一點?如何矢量化NumPy聚合器功能?
使用向量化,我的意思是如果輸入是一個多項式數組,輸出將是具有多項式導數的數組。
一個例子:
p = np.array([[3,4,5], [1,2]])
輸出應該像
np.array([[6, 4], [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]])
因此,如果數量多項式都是一樣的,這個簡單的乘法給出了一階導數係數。當然,行可以填充,所以他們都是一樣的。所以'矢量化'比我最初想象的要容易。
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列表是沒有意義的,並且沒有實際的(硬件級別)向量化會發生。(儘管與一般的列表解釋一樣,解釋者可以自由地使用其他並行性手段來計算它們。)
我在所有係數列表具有相同(可能爲0填充)長度的時候增加了一些想法。 – hpaulj