如何从其他numpy数组的元素自定义计算返回数组?

时间:2017-07-20 14:16:04

标签: python arrays numpy

我想在不同的numpy数组上从元素计算中获得一个numpy数组。截至目前,我正在使用lambda函数返回一个值,对所有值重复该值,从中创建一个列表,并转换为numpy数组:

import math
import numpy as np 
def weightAdjLoads(loadsX, loadsY, angles, g):
        adjust = lambda x, y, a: math.sqrt((abs(x) - math.sin(a)*g)**2 + (abs(y) - math.cos(a)*g)**2)
        return np.array([adjust(x, y, a) for x, y, a in zip (loadsX, loadsY, angles)])

这对我来说似乎太过分了。有没有可以做到这一点的numpy例程?

我知道numpy.sqrt(A ** 2 + B ** 2)等方法,其中A和B是numpy数组。但是,那些只允许应用预定义的公式。如何在numpy数组上应用自定义公式?

1 个答案:

答案 0 :(得分:1)

Python解释器将

numpy.sqrt(A**2 + B**2)解析为大致如下的调用:

 tmp1 = A**2  # A.__pow__(2)
 tmp2 = B**2  #
 tmp3 = tmp1 + tmp2  # tmp1.__add__(tmp2)
 tmp4 = np.sqrt(tmp3)

也就是说,为poweradditionsqrt等定义了numpy函数和方法。

你的lambda使用标量,而不是numpy数组:

math.sqrt((abs(x) - math.sin(a)*g)**2 + (abs(y) - math.cos(a)*g)**2)

具体来说,它是需要标量的math trig函数。 abs适用于数组:

abs(A) => A.__abs__()

numpy提供了一整套trig函数,因此该函数应该与数组或标量参数一起使用:

def foo(x, y, a):
    return np.sqrt((abs(x) - np.sin(a)*g)**2 + (abs(y) - np.cos(a)*g)**2)

有一些方法可以将标量adjust包装成一个numpy函数,但相对于列表理解的速度节省很小。

f = np.vectorize(adjust)
f = np.frompyfunc(adjust, 3, 1)

主要是它们使broadcast数组更容易进行标量函数。但要获得compiled速度,您必须进行转换,例如在foo中,或使用第三方软件包,例如cythonnumbanumexpr