Numpy apply_along_axis函数

时间:2014-02-16 14:17:57

标签: python numpy

我正在尝试使用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函数和一个使用多个参数的函数。

2 个答案:

答案 0 :(得分:6)

签名*args中的numpy.apply_along_axis(func1d, axis, arr, *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])

答案 1 :(得分: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')

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