如何向量化NumPy多边形函数?

时间:2015-05-26 20:57:33

标签: arrays numpy

我想矢量化NumPy函数polyder,它计算多项式的导数。有没有简单的方法或内置的功能呢?

对于vectorize,我的意思是如果输入是多项式数组,则输出将是具有多项式导数的数组。

一个例子:

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

输出应该是

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

2 个答案:

答案 0 :(得分: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数组。强制它们成为一个对象数组需要特殊启动。

一般的经验是 - 如果单个步骤使用不同长度的数组或列表,则可能无法进行矢量化。也就是说,您不能形成矩形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]])

因此,如果多项式的数量都相同,则这个简单的乘法给出一阶导数系数。当然行可以填充,因此它们都是相同的。所以'矢量化'比我最初的想法更容易。

答案 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列表没什么意义,也没有实际的(硬件级)矢量化。 (尽管与一般的列表推导一样,解释器可以自由地使用其他并行方法来计算它们。)