如何在NumPy 1d数组上应用具有不同参数的函数以生成2d数组?

3
假设我有一个NumPy的一维数组a
a = np.array([1, 2, 3])

我有一个函数foo:

def foo(x, p):
    ...
    return y

我想使用 fooa上,例如,使用从1到3的p,生成一个二维数组。

一个简单的 for 循环有什么问题? - Dani Mesejo
我想避免使用for循环,因为这会增加计算成本。事实上,我的问题是我的主要问题的简化版本,其中有数百万行和参数。 - Mehdi Abbassi
foo函数只是幂函数吗? - Dani Mesejo
@DaniMesejo 不一定。 - Mehdi Abbassi
2
我应该为这种经常出现的问题确定一个合适的“重复项”。如果foo只能使用特定的维度进行调用,例如对于x是1d和对于p是标量,则必须针对每个这样的组合调用一次。调用那么多次需要时间,而不是迭代机制的细节。为了减少在numpy中的时间,您需要使用numpy编译的方法,而不是迭代,例如使用(n,)和(1,m)形状的数组的**幂来产生(n,m)结果。在尝试“避免循环”之前,请先学习numpy - hpaulj
感谢 @hpaulj 先生,确实我不是 NumPy 专家。这也正是我在这里提问的原因,大家互相帮助并提供有用的提示和资源。 - Mehdi Abbassi
3个回答

2
或者只需:
>>> a[:, None] ** np.arange(1, 4)
array([[ 1,  1,  1],
       [ 2,  4,  8],
       [ 3,  9, 27]], dtype=int32)
>>> 

使用函数:

def foo(x, p):
    return x ** p

np.apply_along_axis(lambda x: foo(x, np.arange(1, 4)), 1, a[:, None])

array([[ 1,  1,  1],
       [ 2,  4,  8],
       [ 3,  9, 27]], dtype=int32)

1
谢谢,@U12-Forward,但我的问题是一般性的。我在这里以简单的方式代表一般性问题,只是为了简单起见。 - Mehdi Abbassi
1
@MehdiAbbassi 用函数编写的可运行代码已经更新到我的回答中。 - U13-Forward
1
@MehdiAbbassi - 一般而言,提出问题可能会导致错误的假设。这个解决方案是正确的,但可能像 python 循环一样。大多数函数可以使用 numpy 进行向量化计算,以实现快速计算。 - Michael Szczesny
2
这并不能避免循环。apply_along_axis 隐藏了循环,实际上更慢。它必须执行一次试调用才能确定返回值。请不要推荐它,特别是如果 OP 想提高性能的话。 - hpaulj

1
在您的评论中,您说“你想给函数传递两个参数”。为此,您可以使用以下方式使用mapfunctools:

from functools import partial

a = np.array([1, 2, 3])

def foo(x,y,z):
    return list(z ** y + x)

list(map(partial(foo, z=a), range(1,4), range(1,4)))

输出:

[
 [3, 4, 5],  # [1,2,3]**1+1
 [3, 6, 11], # [1,2,3]**2+2
 [3, 10, 29] # [1,2,3]**3+3
]

谢谢你的回答。但实际上,我必须将参数ap都传递给我的函数foo。此外,该函数实际上并不是一个简单的幂函数,我只是为了简化问题而在这里将其命名为foo - Mehdi Abbassi

0
首先,numpy 模块支持数学函数。因此,如果您想在数组上应用数学函数,只需将其编写为普通函数或 lambda 函数,然后将其应用于您的数组。例如:
def foo(x,p):
    return numpy.power(x,p) 

注意:NumPy模块中还有许多数学函数。尝试查看它们:)


** 也可以使用... - U13-Forward
谢谢,@Ayyoub,但我正在寻找一种沿轴应用函数的通用方法。 - Mehdi Abbassi
你是指ndarray中的一行吗? - Ayyoub ESSADEQ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接