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]]
我有一个名为 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]]