我想在不同的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数组上应用自定义公式?
答案 0 :(得分:1)
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)
也就是说,为power
,addition
,sqrt
等定义了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
中,或使用第三方软件包,例如cython
,numba
或numexpr