gpt4 book ai didi

python - 是否可以 numpy.vectorize 一个实例方法?

转载 作者:太空狗 更新时间:2023-10-29 21:36:02 29 4
gpt4 key购买 nike

我发现 numpy.vectorize允许将期望单个数字作为输入的“普通”函数转换为函数,该函数还可以将输入列表转换为函数已映射到每个输入的列表。例如,以下测试通过:

import numpy as np
import pytest


@np.vectorize
def f(x):
if x == 0:
return 1
else:
return 2


def test_1():
assert list(f([0, 1, 2])) == [1, 2, 2]

def test_2():
assert f(0) == 1

if __name__ == "__main__":
pytest.main([__file__])

但是,我无法使它适用于使用实例属性的实例方法。例如:

class Dummy(object):
def __init__(self, val=1):
self.val = val

@np.vectorize
def f(self, x):
if x == 0:
return self.val
else:
return 2


def test_3():
assert list(Dummy().f([0, 1, 2])) == [1, 2, 2]

这个测试失败了:

=================================== FAILURES ===================================
____________________________________ test_3 ____________________________________

def test_3():
> assert list(Dummy().f([0, 1, 2])) == [1, 2, 2]

test_numpy_vectorize.py:31:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/numpy/lib/function_base.py:2739: in __call__
return self._vectorize_call(func=func, args=vargs)
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/numpy/lib/function_base.py:2809: in _vectorize_call
ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <numpy.lib.function_base.vectorize object at 0x106546470>
func = <function Dummy.f at 0x10653a2f0>, args = [array([0, 1, 2])]

def _get_ufunc_and_otypes(self, func, args):
"""Return (ufunc, otypes)."""
# frompyfunc will fail if args is empty
if not args:
raise ValueError('args can not be empty')

if self.otypes is not None:
otypes = self.otypes
nout = len(otypes)

# Note logic here: We only *use* self._ufunc if func is self.pyfunc
# even though we set self._ufunc regardless.
if func is self.pyfunc and self._ufunc is not None:
ufunc = self._ufunc
else:
ufunc = self._ufunc = frompyfunc(func, len(args), nout)
else:
# Get number of outputs and output types by calling the function on
# the first entries of args. We also cache the result to prevent
# the subsequent call when the ufunc is evaluated.
# Assumes that ufunc first evaluates the 0th elements in the input
# arrays (the input values are not checked to ensure this)
args = [asarray(arg) for arg in args]
if builtins.any(arg.size == 0 for arg in args):
raise ValueError('cannot call `vectorize` on size 0 inputs '
'unless `otypes` is set')

inputs = [arg.flat[0] for arg in args]
> outputs = func(*inputs)
E TypeError: f() missing 1 required positional argument: 'x'

是否可以将 numpy.vectorize 应用于实例方法?

最佳答案

不修改类的简单解决方案

您可以直接在实例的方法上使用np.vectorize:

class Dummy(object):

def __init__(self, val=1):
self.val = val

def f(self, x):
if x == 0:
return self.val
else:
return 2


vec_f = np.vectorize(Dummy().f)


def test_3():
assert list(vec_f([0, 1, 2])) == [1, 2, 2]

test_3()

您还可以在 __init__ 中创建矢量化函数 vec_f:

向实例添加矢量化版本

class Dummy(object):

def __init__(self, val=1):
self.val = val
self.vec_f = np.vectorize(self.f)

def f(self, x):
if x == 0:
return self.val
else:
return 2


def test_3():
assert list(Dummy().vec_f([0, 1, 2])) == [1, 2, 2]

或使用不同的命名方案:

class Dummy(object):

def __init__(self, val=1):
self.val = val
self.f = np.vectorize(self.scalar_f)

def scalar_f(self, x):
if x == 0:
return self.val
else:
return 2


def test_3():
assert list(Dummy().f([0, 1, 2])) == [1, 2, 2]

test_3()

test_3()

关于python - 是否可以 numpy.vectorize 一个实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48981501/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com