【问题标题】:Is there anyway to use the index in python numpy vectorize functions?无论如何在 python numpy vectorize 函数中使用索引?
【发布时间】:2019-01-22 02:39:35
【问题描述】:

下面的例子说明了我的问题:

>>> import numpy as np
>>> l = lambda i, value: i*v
>>> y = np.vectorize(l)
>>> y(range(10))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/numpy/lib/function_base.py", line 2755, in __call__
    return self._vectorize_call(func=func, args=vargs)
  File "/usr/local/lib/python3.6/site-packages/numpy/lib/function_base.py", line 2825, in _vectorize_call
    ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
  File "/usr/local/lib/python3.6/site-packages/numpy/lib/function_base.py", line 2785, in _get_ufunc_and_otypes
    outputs = func(*inputs)
TypeError: <lambda>() missing 1 required positional argument: 'value'
>>> y(enumerate(range(10)))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/numpy/lib/function_base.py", line 2755, in __call__
    return self._vectorize_call(func=func, args=vargs)
  File "/usr/local/lib/python3.6/site-packages/numpy/lib/function_base.py", line 2825, in _vectorize_call
    ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
  File "/usr/local/lib/python3.6/site-packages/numpy/lib/function_base.py", line 2785, in _get_ufunc_and_otypes
    outputs = func(*inputs)
TypeError: <lambda>() missing 1 required positional argument: 'value'

有没有像 fromiter 这样的东西支持这一点,但在大输入时速度更快,比如矢量化?

【问题讨论】:

  • 第二行中vvalue 的区别是故意的还是错字?但除此之外,如果你将ly 定义为两个参数的函数,你为什么要用一个来调用y
  • 为什么要在这么简单的功能上使用vectorizel 有 2 个参数,y 也有,一个作为标量源 i,另一个作为标量 value
  • 你读过来自np.vectorizenotes吗?
  • 抱歉打错了@tif
  • "为什么要在这么简单的函数上使用矢量化?"这个函数其实并不简单,这个函数是为了演示的目的

标签: python numpy iterable


【解决方案1】:

你可以求助itertools.count:

import numpy as np
from itertools import count

i = count(-1)
l = lambda value: next(i) * value
y = np.vectorize(l)

print(y(range(10)))
# [ 0  1  4  9 16 25 36 49 64 81]

【讨论】:

  • 这通常不起作用,例如使用发电机,试试y((i for i in range(10)))
【解决方案2】:

np.vectorize 只是一个循环,将一个函数应用于可迭代对象中的每个值。给定一个可迭代对象,它应该不会比通过map + enumerate 依次对每个项目应用一个函数更有效。然后,您可以将map 对象提供给np.fromiter

var = range(10)
indexed = enumerate(var)

def foo(x):
    idx, val = x
    return idx * val

res = np.fromiter(map(foo, indexed), dtype=int)

print(res)

[ 0  1  4  9 16 25 36 49 64 81]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2021-05-02
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多