numpy沿着轴应用错误" ValueError:无法将形状(2)的输入数组广播为形状(1)"

时间:2017-07-26 04:53:41

标签: python arrays numpy

这是我的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)

我不明白为什么会这样。请帮忙。

1 个答案:

答案 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