Python Numpy Linalg行为异常(错误)

Python Numpy Linalg行为异常(错误),python,numpy,Python,Numpy,我有一个大的向量F,它有几百万个条目,在取范数时给出了这种不一致的行为 np.linalg.norm(F,2.000001)=3225.96.. np.linalg.norm(F,2)=inf np.linalg.norm(F,1.999999)=3226.01.. np.linalg.norm(F,1)=inf --------- np.linalg.norm(F)=inf np.linalg.norm(F/12)=inf np.linalg.norm(F/13)=246.25 -------

我有一个大的向量F,它有几百万个条目,在取范数时给出了这种不一致的行为

np.linalg.norm(F,2.000001)=3225.96..
np.linalg.norm(F,2)=inf
np.linalg.norm(F,1.999999)=3226.01..
np.linalg.norm(F,1)=inf
---------
np.linalg.norm(F)=inf
np.linalg.norm(F/12)=inf
np.linalg.norm(F/13)=246.25
---------
np.sum(F*F)=inf
np.sum(F*F/169)=60639
np.sum(F*F/144)=inf
---------
np.all(np.isfinite(F))=True
np.max(np.abs(F))=11
---------
F.dtype=dtype('float16')

除了某种骇人的解决方案,有人知道发生了什么吗?

如评论中所述,您的问题是
float16
太小,无法表示中间结果-其最大值为65504。一个更简单的测试用例是:

np.linalg.norm(np.float16([1000]))
为避免溢出,可以除以最大值,然后再乘以:

def safe_norm(x):
    xmax = np.max(x)
    return np.linalg.norm(x / xmax) * xmax

可能有一种观点认为,默认情况下,
np.linalg.norm
应该为float16这样做Numpy似乎还没有解决方案。因此,为了完整性,我这边的另一个(非常明显的)解决方案是计算范数:

def calcNorm(vector):
    if (vector.dtype == np.float16):
        vector = vector.astype(np.float32)
    return np.linalg.norm(vector)
def normalize(vector):
    prevType = vector.dtype
    if (vector.dtype == np.float16):
        vector = vector.astype(np.float32)
    norm = np.linalg.norm(vector)
    if (norm != 0 and np.isfinite(norm)):
        vector /= norm
    return vector.astype(prevType)
或者,根据我的需要,在规范化向量的用例中:

def calcNorm(vector):
    if (vector.dtype == np.float16):
        vector = vector.astype(np.float32)
    return np.linalg.norm(vector)
def normalize(vector):
    prevType = vector.dtype
    if (vector.dtype == np.float16):
        vector = vector.astype(np.float32)
    norm = np.linalg.norm(vector)
    if (norm != 0 and np.isfinite(norm)):
        vector /= norm
    return vector.astype(prevType)

np.sum(F*F)
给出了什么?删除第二个参数np.linalg.norm(F)怎么样?什么是
np.max(F)
?什么是
np.isfinite(F).all()
?@Eric我以更清晰的格式添加了您要求的计算。什么是
F.dtype
?哎哟<代码>浮动16。可能不是norm优化的目的。@shapespeare
numpy.array([11*11*1e6],dtype='float16')
是无穷大的。Eric,在我接受之前,你能解释一下为什么带$p=1.999$或$p=2.0001$的$L_p$norm有效,但默认的$p=2$无效吗?@shapespeare:np.linalg.norm(F,1.99999)。dtype是什么?它与
p=2
情况相比如何?它是64。谢谢你,亲爱的stranger@Shakespeare:numpy的类型检测有点奇怪,但如果使用
np.linalg.norm(…,np.float16(1.9999))
您现在正在和一个用户说话;),它会像预期的那样失败。不过我已经向其他numpy人提出了申请