我正在尝试使用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函数和一个使用多个参数的函数。
答案 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')
请注意,我们不必担心关键字参数的顺序。