【问题标题】:How to apply a function with different arguments on a NumPy 1d-array to make a 2d-array如何在 NumPy 一维数组上应用具有不同参数的函数来制作二维数组
【发布时间】:2021-09-19 19:21:26
【问题描述】:

假设我有一个 NumPy 一维数组a

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

我有一个函数foo:

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

我想在a 上应用foo,例如,p 从 1 到 3 以制作二维数组。

【问题讨论】:

  • 简单的for循环有什么问题?
  • 由于计算成本,我想避免 for 循环。事实上,我的问题是我的主要问题的简化版本,我有数百万行和参数。
  • foo函数只是幂函数吗?
  • @DaniMesejo 不一定。
  • 我应该为这类问题找到一个合适的duplicate,因为它经常出现。如果 foo 只能用特定尺寸调用,例如1d 表示x,标量表示p,每个这样的组合都必须调用一次。多次调用是占用时间的,而不是迭代机制的细节。为了减少numpy 的时间,您需要使用numpy 编译方法而不进行迭代,例如** power 与 (n,) 和 (1,m) 形状的数组生成 (n,m) 结果。 在尝试“避免循环”之前了解numpy

标签: python numpy


【解决方案1】:

或者只是:

>>> 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)

【讨论】:

  • 谢谢,@U12-Forward 但我的问题很笼统。为了简单起见,我在这里以简单的方式表示一般问题。
  • @MehdiAbbassi 用带有函数的工作代码编辑了我的答案
  • @MehdiAbbassi - 问一般会导致错误的假设。这个解决方案是正确的,但可以像slow 一样作为python 循环。大多数函数都可以使用numpy进行矢量化以进行快速计算。
  • 这并不能避免循环。 apply_along_axis 隐藏了循环,实际上更慢。它必须执行一次试调用才能确定返回值。请不要推荐它,特别是如果 OP 想要提高性能。
【解决方案2】:

在您的评论中,您说you want to give both arguments to function 为此,您可以使用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放在这里这样简化问题,
【解决方案3】:

首先,numpy 模块支持数学函数。所以,如果你想在数组上应用数学函数,你只需将它写成普通函数或 lambda 函数,然后将它应用到你的数组上。例如:

def foo(x,p):
    return numpy.power(x,p) 

注意:这些在 numpy 模块中有更多的数学功能。试着看看他们:)。

【讨论】:

  • ** 也有效...
  • 谢谢@Ayyoub,但我一直在寻找一种沿轴应用函数的通用方法。
  • 你的意思是 ndarray 中的一行吗?
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多