Python numpy矢量化函数
我想使用矢量化在Python numpy矢量化函数,python,function,numpy,vectorization,Python,Function,Numpy,Vectorization,我想使用矢量化在numpy.ndarray上进行一些计算。假设我有以下向量化函数: import numpy as np fun = lambda x:x[0]+x[1] fun = np.vectorize(fun) 以及以下numpy.ndarray a = range(10) b = range(10) c = np.array([a,b]) 当我申请时 result = fun(c) 我得到以下错误 IndexError: invalid index to scalar
numpy.ndarray
上进行一些计算。假设我有以下向量化函数:
import numpy as np
fun = lambda x:x[0]+x[1]
fun = np.vectorize(fun)
以及以下numpy.ndarray
a = range(10)
b = range(10)
c = np.array([a,b])
当我申请时
result = fun(c)
我得到以下错误
IndexError: invalid index to scalar variable.
\为什么会出现这种情况?我应该如何修复它?
np.vectorize
将标量值提供给函数。它在输入数组上迭代,根据需要广播,并提供func
标量,而不是数组或列表。然后,它将值收集到一个新的shape和dtype数组中,并由此推断
例如:
In [108]: fun = lambda x,y: x+y
...: fun = np.vectorize(fun)
In [110]: a=np.arange(10); b=np.arange(10)
In [111]: fun(a,b)
Out[111]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
从将函数转换为快速编译代码的意义上讲,它不是“矢量化”。这很方便,为你节省了一些建立互动的工作
我相信你的乐趣
只是一个例子,但正如我写的那样,它已经“矢量化了”
In [112]: (lambda x,y: x+y)(a,b)
Out[112]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
用numpy原语表示计算,而不进行迭代,这才是真正的“矢量化”。这并不总是可能的,但是如果你觉得你必须依靠np.vectorize
记住这一点
- 它喂标量
- 它将以Python的速度进行迭代
- 如果可能,请使用
o类型
np.矢量化
。更确切地说,你希望ufuncs
有什么乐趣呢?矢量化函数将应用于数组的每个元素,那么当x
是一个数字时,x[0]+x[1]
假设如何工作?另外,我支持不要使用np.vectorize
,它本质上是一个普通Python循环的薄包装。