规范化iterable类型,使输出是和为1的浮点的iterable

2024-10-03 02:39:22 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧

我遇到了舍入误差问题。我有一个java程序,可以逐行读取一个列表,一些数字。程序要求这个列表是float(什么类型的float?我怀疑是单精度)数字,其和S在.999和1.001之间(即.999<;=S<;=1.001)。下面是一个例子:

from numpy import array, linalg

def Normalize(X):
    NumpyX = array(X)
    Norm = linalg.norm(NumpyX)
    Normalize = NumpyX/Norm
    return Normalize

def FileMaker(FilePointer,Vector)
    for i in Vector:
        FilePointer.write('%f\n'%i)
    return


#sum(SubstitutionPoints) does not add to 1
SubstitutionPoints =[0.00606508512067950,0.00675296642376962,0.00688999694872917,0.00580692396866418,0.00680583604896024,0.00609061670962565,0.00585881991631447,0.00577148570812953,0.00600882981888663,0.00618499536435559,0.00650767341787896,0.00670521809234427,0.00699374780209504,0.00841141135948587,0.00830145870238677,0.00879477131238090,0.00918627324146331,0.00958946761973615,0.01032404247887830,0.01093417870737930,0.01188202458790520,0.01261860720648550,0.01355451051017660,0.01473818756656830,0.01623978223562570,0.01811682034513980,0.01990010225231130,0.02154250858435480,0.02418185925226890,0.02583490296173980,0.02844212438633430,0.03194935989118780,0.03534228607419560,0.03971366519834600,0.04548573525944540,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660,0.05190994307855660]
NormedSP = Normalize(SubstitutionPoints)
SubFile = open('Sub.txt','w')
FileMaker(SubFile,NormedSP)
SubFile.close()

由于python不使用单精度浮点,我担心创建的文件会在java程序中引起问题,因为我的java程序(metasim)返回一个错误:

^{pr2}$

不幸的是,我无法调试java程序,因为它是“java可执行文件”。我唯一的选择就是给出正确的输入。在

如有任何建议/帮助,我们将不胜感激。在

编辑

根据尝试float32()的一些建议,我修改了normalize方法如下:

def Normalize(self,X):
    Total = sum(X)
    NumpyX = array([float32(i) for i in X])
    Norm = linalg.norm(NumpyX,ord=1)
    Normalize = NumpyX/Norm
    return Normalize

我开始怀疑这是单精度浮点问题。在

我的输出是否被截断并导致错误?在


Tags: 程序norm列表returndef数字javafloat
3条回答

^{}需要ord=1关键字arg来执行您期望的操作。使用当前数据和定义。。。在

>>> Normalize(substitution_points).sum()
9.0451896403987444

您可以这样做,这样也可以正确缩放负值(linalg.norm将值的abs相加):

^{pr2}$

0.9999999... > 0.999,因此根据您提供的规范,它应该是有效的。在

但是。。。看来还是不行。尝试使用numpy.float16并注意创建float数组的惯用方法如下:

array([ 0.,  1.,  2.,  3.,  4.], dtype=float32)

如果您只需要精确到小数点后三位,为什么不将值乘以1000,用整数进行所有运算,然后在输出中只添加小数点?这样就很容易保证总数是准确的。在

Normalize方法不会将列表的和强制为1:除以norm会将norm设置为1。若要将总计设置为1,需要除以当前总计:

def normalize(X):
   total = sum(X)
   return [x/total for x in X]

相关问题 更多 >