Numpy linalg规范在指定订单时不接受标量

时间:2015-05-08 21:53:06

标签: python numpy

嗯,标题说明了一切:

from numpy import linalg as LA
import numpy as np
fortytwo = np.array(42)
LA.norm(42) # works
LA.norm(fortytwo) # works
# All the lines below raise a ValueError:
LA.norm(fortytwo,np.inf)
LA.norm(fortytwo,-np.inf)
LA.norm(fortytwo,1)
LA.norm(42,1)

我不得不在我的代码中放置一些丑陋的特殊情况来处理这个问题。有没有比标量值的特殊情况更好的方法来处理这个问题?为什么这个函数是这样编写的?

文档也没有提及:http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html

1 个答案:

答案 0 :(得分:1)

这是代码的一部分(所有Python都可以查看):

if ord is None and axis is None:
    return sqrt(add.reduce((x.conj() * x).real, axis=None))

这是你的情况。

但是当您指定ord时,它会查看尺寸。在您的情况下nd==0

# Normalize the `axis` argument to a tuple.
nd = x.ndim
if axis is None:
    axis = tuple(range(nd))
elif not isinstance(axis, tuple):
    axis = (axis,)

现在axis(),是一个空元组

if len(axis) == 1:
    # do things like .max(axis=axis):
...
elif len(axis) == 2:
    row_axis, col_axis = axis
    # multi dim. calculations
...
else:
    raise ValueError("Improper number of dimensions to norm.")

这是您的错误 - 0d数组和非默认ord

我猜他们可能会提出另一种情况 - 如果0d忽略ord参数。或者你可以自己做。