我在 % 格式规范中找不到任何可以为浮点数创建 hex 的内容(只有 %x 用于整数) . 所以接受你的 float.hex ,我可以创建一个函数,将数组中的每个浮点数转换为十六进制字符串:
def foo(x):
return x.hex()
vfoo=np.vectorize(foo) # just for ease of applying foo to an array
In [478]: x=np.arange(12.).reshape(3,4)/3
In [479]: x
Out[479]:
array([[ 0. , 0.33333333, 0.66666667, 1. ],
[ 1.33333333, 1.66666667, 2. , 2.33333333],
[ 2.66666667, 3. , 3.33333333, 3.66666667]])
In [480]: vfoo(x)
Out[480]:
array([['0x0.0p+0', '0x1.5555555555555p-2', '0x1.5555555555555p-1',
'0x1.0000000000000p+0'],
['0x1.5555555555555p+0', '0x1.aaaaaaaaaaaabp+0',
'0x1.0000000000000p+1', '0x1.2aaaaaaaaaaabp+1'],
['0x1.5555555555555p+1', '0x1.8000000000000p+1',
'0x1.aaaaaaaaaaaabp+1', '0x1.d555555555555p+1']],
dtype='
然后我可以使用通常的 savetxt 将这些字符串写入文件
In [481]: np.savetxt('test.txt',vfoo(x), fmt='%25s',delimiter=',')
看起来像:
In [482]: cat test.txt
0x0.0p+0, 0x1.5555555555555p-2, 0x1.5555555555555p-1, 0x1.0000000000000p+0
0x1.5555555555555p+0, 0x1.aaaaaaaaaaaabp+0, 0x1.0000000000000p+1, 0x1.2aaaaaaaaaaabp+1
0x1.5555555555555p+1, 0x1.8000000000000p+1, 0x1.aaaaaaaaaaaabp+1, 0x1.d555555555555p+1
和 loadtxt 可以处理这个问题
In [486]: np.loadtxt('test.txt',delimiter=',')
Out[486]:
array([[ 0. , 0.33333333, 0.66666667, 1. ],
[ 1.33333333, 1.66666667, 2. , 2.33333333],
[ 2.66666667, 3. , 3.33333333, 3.66666667]])
loadtxt 在看到 0x 列时使用这段代码
/usr/lib/python3/dist-packages/numpy/lib/npyio.py in floatconv(x)
656 x.lower()
657 if b'0x' in x:
--> 658 return float.fromhex(asstr(x))
您可以通过研究 npyio.py 文件获得其他想法 .