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循环的薄包装。