这是我的numpy数组的一个示例,我想为矩阵mapping
的每一行应用函数test
。
test = np.array([[0, .1, .9], [.1, .9, .8], [.8, .6, .1]])
test2 = np.array(['a','b','c'])
def mapping(x):
return test2[np.where(x > .7)].tolist()
这是有效的
mapping(test[0]), mapping(test[1]), mapping(test[2])
正确的结果:(['c'], ['b', 'c'], ['a','b'])
但是没有,并且吐出错误。
np.apply_along_axis(mapping, 1, test)
我不明白为什么会这样。请帮忙。
答案 0 :(得分:2)
来自apply
文档:
The output array. The shape of `outarr` is identical to the shape of
`arr`, except along the `axis` dimension. This axis is removed, and
replaced with new dimensions equal to the shape of the return value
of `func1d`. So if `func1d` returns a scalar `outarr` will have one
fewer dimensions than `arr`.
mapping
的返回值的形状是什么? apply...
尝试通过对第一项进行计算来猜测这一点。在您的情况下['c']
。因此它会尝试返回一个(3,1)数组,并在第二行返回值时遇到问题。
将您的函数应用于test
行的最佳方法是:
In [240]: [mapping(x) for x in test]
Out[240]: [['c'], ['b', 'c'], ['a']]
In [246]: np.apply_along_axis(mapping, 1, test[[0,2],:])
Out[246]:
array([['c'],
['a']],
dtype='<U1')
即使它起作用,apply_along_axis
也不会提高速度 - 事实上它更糟糕
In [249]: timeit [mapping(x) for x in test]
20.4 µs ± 33 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [250]: timeit np.array([mapping(x) for x in test])
25.1 µs ± 192 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [251]: timeit np.apply_along_axis(mapping, 1, test[[0,2,2],:])
146 µs ± 194 ns per loop (mean ± std. dev. of 7 runs, 10000 loops e