2013-11-23 46 views
7

我在Pyzo中使用Python 3。请你能告诉我为什么linalg.norm函数不能识别轴参数。linalg.norm未采用轴参数

此代码:

c = np.array([[ 1, 2, 3],[-1, 1, 4]]) 
d=linalg.norm(c, axis=1) 

返回错误:

TypeError: norm() got an unexpected keyword argument 'axis'

+4

在1.8版本中添加了'axis'参数的numpy;请参阅http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html。你使用什么版本? –

回答

10

linalg.norm不接受axis说法。让您可以与:

np.sqrt(np.einsum('ij,ij->i',c,c)) 
# array([ 3.74165739, 4.24264069]) 

对于时机:

np.apply_along_axis(np.linalg.norm, 1, c) 
# array([ 3.74165739, 4.24264069]) 

还是要快一些,自己与实现它

timeit np.apply_along_axis(np.linalg.norm, 1, c) 
10000 loops, best of 3: 170 µs per loop 

timeit np.sqrt(np.einsum('ij,ij->i',c,c)) 
100000 loops, best of 3: 10.7 µs per loop 
+0

谢谢。你的第一个建议对我来说很好。 –

4

numpy版本低于1.8linalg.norm不采取axis的说法,你可以用np.apply_along_axis得到您想要的结果,如指出,由沃伦Weckesser在对这个问题的评论。

import numpy as np 
from numpy import linalg 

c = np.array([[ 1, 2, 3],[-1, 1, 4]]) 

d = np.apply_along_axis(linalg.norm, 1, c) 

结果:

>>> d 
array([ 3.74165739, 4.24264069]) 
+0

谢谢,这个按照需要工作。 –

+0

Downvoter,你可以发表评论,至于你为什么downvoted? – Akavall

+0

不知道downvoter,但这对我工作!小的更正:您需要在上面的示例代码中使用np.linalg。特别感谢评论它在v1.8以下不起作用。 – GnomeDePlume