将NumPy数字数组转换为不带尾随零的字符串

5

问题:将一个numpy数值数组转换为指定小数位数且去除尾部零的numpy字符串数组,我的方法是否是最好的?

import numpy as np
x = np.array([1.12345, 1.2, 0.1, 0, 1.230000])
print np.core.defchararray.rstrip(np.char.mod('%.4f', x), '0')

输出:

['1.1235' '1.2' '0.1' '0.' '1.23']

这是期望的结果。(我对四舍五入问题没有问题)

‘rstrip’和‘mod’函数都是numpy函数,这意味着速度很快,但是否有一种方法可以使用一个内置的numpy函数来实现呢?(即‘mod’是否有一个我找不到的选项?)这将节省两次返回副本的开销,对于非常大的数组而言速度较慢。

谢谢!


1
为什么不直接使用 print np.char.mod('%0.4f', x) - Dalek
如果您可以接受使用5个“有效数字”而不是4个小数位,可以使用 np.char.mod("%.5g", x) - Warren Weckesser
你是用 np.savetxt 创建文件的吗? - Warren Weckesser
3
你使用的是哪个版本的numpy?在最新的numpy版本中,savetxt函数可以接受文件句柄作为参数:http://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html - Warren Weckesser
1
相关链接:https://dev59.com/Y4Hba4cB1Zd3GeqPRG1H - Warren Weckesser
显示剩余4条评论
1个回答

2

感谢Warren Weckesser提供宝贵的意见。对他表示感谢。

我将我的代码转换为使用:

formatter = '%d'
if num_type == 'float':
  formatter = '%%.%df' % decimals
np.savetxt(out, arr, fmt=formatter)

其中,out是文件句柄,我已经将标题写入其中。或者,我也可以在np.savetxt中使用headers=参数。我不知道为什么在文档中没有看到这些选项。

对于一个1300乘以1300的numpy数组,像之前一样逐行输出(使用np.core.defchararray.rstrip(np.char.mod('%.4f', x), '0'))需要大约1.7秒,而使用np.savetxt只需要0.48秒。

因此,np.savetxt是一种更干净、更易读和更快的解决方案。

注意:

np.savetxt(out, arr, fmt='%.4g')

为了避免基于数字类型的开关,但它没有像我希望的那样工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接