【问题标题】:numpy number array to strings with trailing zeros removednumpy 数字数组到删除尾随零的字符串
【发布时间】:2014-08-20 00:46:57
【问题描述】:

问题:我将 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 函数,这意味着这很快,但是有没有办法使用 ONE 内置的 numpy 函数来完成呢? (即 'mod' 有一个我找不到的选项吗?)它可以节省返回副本两次的开销,这对于非常大的数组来说很慢。

谢谢!

【问题讨论】:

  • 你为什么不直接使用print np.char.mod('%0.4f', x)
  • @Dalek 因为这不会删除尾随零。我想删除零的原因是它会使我的文件更小。我正在手动创建一些 ascii GIS 栅格,并且希望将大文件保持尽可能小。在速度方面,删除尾随零的额外操作不是投标交易,所以我认为它值得拥有更小的文件。一些文件比需要的大就好了,但我打算做一些相当大的事情......它会加起来。所以,我对我使用的速度没问题,但我很好奇是否有人有更流畅的方式。
  • 如果您可以接受 5 个“有效数字”而不是 4 个小数位,您可以使用 np.char.mod("%.5g", x)
  • 你使用的是什么版本的 numpy?在最新版本的 numpy 中,savetxt 接受文件句柄:docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html

标签: string numpy format


【解决方案1】:

感谢 Warren Weckesser 提供了宝贵的 cmets。归功于他。

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

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

out 是一个文件句柄,我已经写了我的头文件。或者,我也可以在np.savetxt 中使用headers= 参数。我不知道如何在文档中没有看到这些选项。

对于一个 1300 x 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')

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多