您的问题并没有明确说明您希望从矢量化函数中看到什么输出,但我假设您希望将相同的列表 (A) 作为参数应用于 f() 的每次调用(即一次对于 X 数组中的每个元素)
函数的矢量化版本确保所有参数都是数组,然后应用numpy 的广播规则来确定应如何组合这些参数。
与 np.array 对 np.ndarray 的包装一样,通过自动将列表转换为包含相同元素的数组,而不是使用 dtype=object 将列表包含为它的唯一元素。大多数时候这是我们想要的,但在你的情况下,这种“聪明”的行为又回来咬你了。
虽然可能有一种方法可以指示 numpy 仅将某些输入视为向量,但有两种直接的方法可以获取您所追求的行为:
- 使用 dtype=object手动创建一个数组以在广播规则内工作
- 在向量化函数之前对值进行柯里化
1. dtype=对象
Numpy 数组的效率源于仅存储一种类型的项目,但它们仍然可以通过指定存储的数据类型为 python 对象来包含任意 python 对象:
list_obj_array = np.ndarray((1,), dtype=object)
list_obj_array[0] = [1,2,3]
f2(X,list_obj_array) # using your definition from above
印刷:
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
并返回:
array([ 6. , 5.4 , 4.90909091, 4.5 , 4.15384615,
3.85714286, 3.6 , 3.375 , 3.17647059, 3. ])
2.咖喱
由于您将相同的列表传递给数组中每个项目的函数调用,因此您可以在应用矢量化之前通过currying直接将列表与函数一起存储:
def curry_f(A):
def f_curried(x):
return f(x, A) # using your definition from above
return f_curried
f2 = np.vectorize(curry_f(P))
f2(X)
印刷:
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
type(A)=<type 'list'>, A=[1, 2, 3]
并返回:
array([ 6. , 5.4 , 4.90909091, 4.5 , 4.15384615,
3.85714286, 3.6 , 3.375 , 3.17647059, 3. ])
PS你可能还想看看np.frompyfunc——它类似于vectorize(),但工作的级别略低。