将 numpy 字符串数组转换为与字符串具有相同 sigfigs 的浮点数

Converting an array of numpy strings into floats with the same sigfigs as string

提问人:Navya Lam 提问时间:7/6/2023 更新时间:7/6/2023 访问量:44

问:

我想将 numpy 数组 ['800', '0', '0.3048', '71.3', '0.00266337'] 转换为带有字符串中所示的 sigfigs 的浮点形式。

当我尝试时(在这个答案的帮助下,我得到了 [8.00000e+02 0.00000e+00 3.04800e-01 7.13000e+01 2.66337e-03] 我不想看到完整的浮点形式。有没有办法让它按照字符串中的方式格式化浮点数?我宁愿不必为每个特定列大小写四舍五入到我想要的小数点。X_new = X_tr.astype(float)

python 字符串 numpy 浮点 numpy-ndarray

评论


答:

0赞 jared 7/6/2023 #1

使用 numpy 数组无法获得所需的结果,因为 numpy 数组必须都是一种数据类型。在您的示例中,前两个数字需要是整数,而其余数字是浮点数。如果你对 python 列表没问题,那么你可以使用该函数并更改每个数字的参数。rounddecimal

def get_decimals(n):
    if "." not in n:
        return None
    after_decimal = n.split(".")[1]
    return len(after_decimal)

a = ['800', '0', '0.3048', '71.3', '0.00266337']
decimals = [get_decimals(_a) for _a in a]
a_float = [float(_a) for _a in a]
a_rounded = [round(_a, decimal) for _a, decimal in zip(a_float, decimals)]
print(a_rounded)        # [800, 0, 0.3048, 71.3, 0.00266337]
0赞 dankal444 7/6/2023 #2

不完全是你想要的(800.0 而不是 800),但最简单的代码是:

list_of_floats = [float(item) for item in ['800', '0', '0.3048', '71.3', '0.00266337']]
print(list_of_floats)
[800.0, 0.0, 0.3048, 71.3, 0.00266337]
1赞 hpaulj 7/6/2023 #3

这是一项列表任务。从返回整数或浮点数的实用程序函数开始:

In [392]: def foo(astr):
     ...:     try:
     ...:         res = int(astr)
     ...:     except ValueError:
     ...:         res = float(astr)
     ...:     return res
     ...: 

将其应用于字符串列表:

In [393]: alist = ['800', '0', '0.3048', '71.3', '0.00266337']

In [394]: [foo(i) for i in alist]
Out[394]: [800, 0, 0.3048, 71.3, 0.00266337]

如果必须获取数组,请将其设为 object dtype:

In [395]: np.array([foo(i) for i in alist], dtype=object)
Out[395]: array([800, 0, 0.3048, 71.3, 0.00266337], dtype=object)