【问题标题】:Numpy apply_along_axis functionNumpy apply_along_axis 函数
【发布时间】:2014-02-16 14:17:56
【问题描述】:

我正在尝试将 numpys apply_along_axis 与需要多个参数的函数一起使用。

test_array = np.arange(10)
test_array2 = np.arange(10)

def example_func(a,b):
   return a+b

np.apply_along_axis(example_func, axis=0, arr=test_array, args=test_array2)

在手册中:http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html 有用于附加参数的参数 args。但是如果我尝试添加该参数,python 会返回错误:

*TypeError: apply_along_axis() 得到了一个意外的关键字参数 'args'*

或者如果我不使用 args 则缺少参数

*TypeError: example_func() 正好接受 2 个参数(给定 1 个)*

这只是一个示例代码,我知道我可以用不同的方式解决这个问题,比如使用 numpy.add 或 np.vectorize。但我的问题是我是否可以将 numpys apply_along_axis 函数与使用多个参数的函数一起使用。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    签名numpy.apply_along_axis(func1d, axis, arr, *args)中的*args表示还有一些其他的positional arguments可以通过。

    如果要按元素添加两个 numpy 数组,只需使用 + 运算符:

    In [112]: test_array = np.arange(10)
         ...: test_array2 = np.arange(10)
    
    In [113]: test_array+test_array2
    Out[113]: array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
    

    删除关键字axis=arr=args= 也应该可以工作:

    In [120]: np.apply_along_axis(example_func, 0, test_array, test_array2)
    Out[120]: array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
    

    【讨论】:

    • 不确定您是否正确阅读了我的问题。我的问题是我是否或如何将 apply_along_axis 与使用多个参数的函数一起使用。我的问题中的函数只是一个无意义的例子来展示我想要做什么。
    【解决方案2】:

    我只想简要说明zhangxaochen's answer,以防对某人有所帮助。让我们举一个例子,我们想用特定的问候来问候一组人。

    def greet(name, greeting):
        print(f'{greeting}, {name}!')
    
    names = np.array(["Luke", "Leia"]).reshape(2,1)
    

    由于apply_along_axis 接受*args,我们可以pass an arbitrary number of arguments to it,在这种情况下每个都将传递给func1d

    避免语法错误

    为了避免SyntaxError: positional argument follows keyword argument,我们必须标记参数:

    np.apply_along_axis(func1d=greet, axis=1, arr=names, greeting='Hello')
    

    不止一个附加参数

    如果我们也有一个接受更多参数的函数

    def greet_with_date(name, greeting, date):
        print(f'{greeting}, {name}! Today is {date}.')
    

    我们可以通过以下任一方式使用它:

    np.apply_along_axis(greet_with_date, 1, names, 'Hello', 'May 4th')
    np.apply_along_axis(func1d=greet_with_date, axis=1, arr=names, date='May 4th', greeting='Hello')
    

    请注意,我们不需要担心关键字参数的顺序。

    【讨论】:

      猜你喜欢
      • 2018-03-17
      • 1970-01-01
      • 2020-09-07
      • 2016-11-03
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多