【问题标题】:How to return array from element-wise custom calculation on other numpy arrays?如何从其他numpy数组的元素自定义计算中返回数组?
【发布时间】:2017-07-20 14:16:04
【问题描述】:

我想从不同 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 数组上应用自定义公式?

【问题讨论】:

  • “但是,那些只允许应用预定义的公式。如何在 numpy 数组上应用自定义公式?” - 你是什么意思,只有预定义的公式?以自然适用于 NumPy 数组的方式编写自定义公式。

标签: python arrays numpy


【解决方案1】:

numpy.sqrt(A**2 + B**2) 被 Python 解释器解析成调用大致如下:

 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 三角函数需要标量。 abs 使用数组:

abs(A) => A.__abs__()

numpy 提供了完整的三角函数集,因此该函数应与数组或标量参数一起使用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2017-05-14
    • 2022-01-14
    • 1970-01-01
    • 2012-01-11
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多