获得所需输出“ Numpy Vectorized”的替代方法

时间:2019-08-01 11:49:38

标签: python numpy

是否有替代方法来获得所需的输出?现在,通过调用numpy.vectorize函数导入numpy包,它可以正常工作。

我不想导入包,我想通过编写原始python代码来实现此目的。有什么建议吗?

def comp(a, b):
    if a < b:
        return a+b
    else:
        return a-b

import numpy as np
b = np.vectorize(comp)
c = b([1, 2, 3], 2)
c

应该获得类似[3, 0, 1]

的结果

2 个答案:

答案 0 :(得分:4)

只需使用列表理解:

[comp(x, 2) for x in [1,2,3]]

或在两个列表中map使用该功能:

list(map(comp, [1,2,3], [2,2,2]))

或使用functools.partial并将其结果映射到列表中:

import functools
list(map(functools.partial(comp, b=2), [1,2,3]))

答案 1 :(得分:2)

或者,使用itertools[2]之外创建循环迭代器:

import itertools


list(map(comp, [1, 2, 3], itertools.cycle([2])))

或者,不使用itertools但基本相同的想法(请注意,对于range(n)也可以使用任何n >= 3,您将得到相同的结果):

list(map(comp, [1, 2, 3], (2 for _ in range(3))))

编辑

您也可以拥有自己的装饰器。 例如,如果您愿意始终提供 1D 可迭代对象并总是循环最短的对象,则可以使用以下(原始但实用的)代码:

import itertools


def iterize(func):
    def wrapper(*args, **kwargs):
        max_len = max(len(arg) for arg in args)
        return list(map(
             func,
             *(arg if len(arg) == max_len else itertools.cycle(arg)
               for arg in args),
             **kwargs))
    return wrapper

可以这样使用:

@iterize
def comp(a, b):
    return a + (b if a < b else -b)


comp([1, 2, 3], [2])
# [3, 0, 1]

comp(range(10), range(5))
# [0, 0, 0, 0, 0, 5, 5, 5, 5, 5]

当然可以设想不同的方式来处理参数,处理不同的长度等。