str.replace()不能将零点(0.)替换为零点零(0.0)

str.replace() can not replace zero dot (0.) to zero dot zero (0.0)

我有一个名为 arr 的 np.array,它是:

arr = np.array([[0.0, 0.0, 0.0], [1 / 3, 1 / 3, 0], [0.0, 0.0, 0.0]])

我想将它的信息写入一个名为 s 单行 字符串:

[[0.0, 0.0, 0.0], [1 / 3, 1 / 3, 0], [0.0, 0.0, 0.0]]

为此,我正在使用这种类型的对话(在我的代码中它在一个函数中):

import re
import numpy as np

arr = np.array([[0.0, 0.0, 0.0], [1 / 3, 1 / 3, 0], [0.0, 0.0, 0.0]])
s = np.array_str(arr, precision=4)
s = re.sub('(\d) +(-|\d)', r',', s)
s.replace('^0. $', '0.0')
# s.replace('0. ', '0.0') #gives same result
s.replace('\n', ',')

print(s)

然而,结果是:

[[0.     0.     0.    ]
 [0.3333,0.3333,0.    ]
 [0.     0.     0.    ]]

您需要捕获 s.replace() 的输出并将其保存为 s 变量,或其他变量名。

import re
import numpy as np

arr = np.array([[0.0, 0.0, 0.0], [1 / 3, 1 / 3, 0], [0.0, 0.0, 0.0]])
s = np.array_str(arr, precision=4)
s = re.sub('(\d) +(-|\d)', r',', s)
s = s.replace('0. ', '0.0') #gives same result
s = s.replace('\n', ',')
print(s)

您可以在数组上使用嵌套理解并使用分数模块对其进行处理:

from fractions import Fraction

s = "["+", ".join("["+", ".join(f"{Fraction(n).limit_denominator(10000)}"  
                              for n in row)+"]" 
                 for row in arr )+"]"
print(s)
[[0, 0, 0], [1/3, 1/3, 0], [0, 0, 0]]

请注意,虽然这接近您的预期结果,但无法区分原始数组中的 0.0 和 0,因为当数字转换为浮点数时,此信息会丢失麻木的。所以所有的0都将以相同的方式打印。

对于超过 2 个维度,您可以将其概括为递归函数:

from fractions import Fraction

def arrayToStr(arr):
    if isinstance(arr,np.ndarray):
        return "["+", ".join(arrayToStr(n) for n in arr)+"]"
    if not arr return "0.0"
    return f"{Fraction(arr).limit_denominator(10000)}"

这会将零打印为 0.0,但我不明白为什么你会想要专门(且仅)为零执行此操作。

输出:

arr = np.array([[0.0, 0.0, 0.0], [1 / 3, 1 / 3, 0], [0.0, 0.0, 0.0]])
print(arrayToStr(arr))
[[0.0, 0.0, 0.0], [1/3, 1/3, 0.0], [0.0, 0.0, 0.0]]

arr = np.arange(24).reshape((4,3,2))/6
print(arrayToStr(arr))
[[[0.0, 1/6], [1/3, 1/2], [2/3, 5/6]], [[1, 7/6], [4/3, 3/2], [5/3, 11/6]], [[2, 13/6], [7/3, 5/2], [8/3, 17/6]], [[3, 19/6], [10/3, 7/2], [11/3, 23/6]]]

如果您不介意将 1/3 值作为小数,您可以使用 json 模块,它可以更直接地进行格式化:

import json
s = json.dumps(arr.tolist())
print(s)
[[0.0, 0.0, 0.0], [0.3333333333333333, 0.3333333333333333, 0.0], [0.0, 0.0, 0.0]]