这个应该很容易。

这是我的数组(相反,一种生成代表性测试数组的方法):

>>> ri = numpy.random.randint
>>> ri2 = lambda x: ''.join(ri(0,9,x).astype('S'))
>>> a = array([float(ri2(x)+ '.' + ri2(y)) for x,y in ri(1,10,(10,2))])
>>> a
array([  7.99914000e+01,   2.08000000e+01,   3.94000000e+02,
         4.66100000e+03,   5.00000000e+00,   1.72575100e+03,
         3.91500000e+02,   1.90610000e+04,   1.16247000e+04,
         3.53920000e+02])

我想要一个字符串列表,其中'\ n'.join(list_o_strings)会打印出来:

   79.9914
   20.8
  394.0
 4661.0
    5.0
 1725.751
  391.5
19061.0
11624.7
  353.92

我想在左侧右侧(但不超过必要)空格键盘。

如果小数点后的所有内容,我想在小数点后面为零。

我不想要科学记谱法。

..我不想丢失任何有效数字。 (在353.98000000000002中2表示不重要)

是的,很高兴想要......

Python 2.5的%g,%fx.x 等要么迷惑我,要么无法做到。 我还没有尝试 import decimal 。我无法看到 NumPy 也这样做(尽管 array .__ str __ array .__ repr __ 是十进制对齐的(但有时会返回科学)。

哦,速度很重要。我在这里处理大数组。

我目前的解决方案方法是:

  1. 到str(a)并解析NumPy的括号
  2. 到str(e)数组中的每个元素并拆分('。')然后填充并重建
  3. 到a.astype('S'+ str(i)),其中i是max(len(str(a))),然后填充
  4. 似乎应该有一些现成的解决方案......(但不是必需的)

    dtype 是float64:

    时,最高建议失败
    >>> a
    array([  5.50056103e+02,   6.77383566e+03,   6.01001513e+05,
             3.55425142e+08,   7.07254875e+05,   8.83174744e+02,
             8.22320510e+01,   4.25076609e+08,   6.28662635e+07,
             1.56503068e+02])
    >>> ut0 = re.compile(r'(\d)0+)
    >>> thelist = [ut0.sub(r'\1', "%12f" % x) for x in a]
    >>> print '\n'.join(thelist)
      550.056103
     6773.835663
    601001.513
    355425141.8471
    707254.875038
      883.174744
       82.232051
    425076608.7676
    62866263.55
      156.503068
    
有帮助吗?

解决方案

很抱歉,经过彻底调查后,我找不到任何方法来执行您需要的任务,而无需进行最少的后处理(剥去您不想看到的尾随零);类似的东西:

import re
ut0 = re.compile(r'(\d)0+

快速而简洁,但打破了你对“现成”的限制。 - 相反,它是一般格式化的模块化组合(几乎可以实现您想要的,但留下您想要隐藏的尾随零)和RE以删除不需要的尾随零。实际上,我认为它完全符合您的要求,但我认为您所陈述的条件过度约束。

修改:编辑了原始问题以指定更多有效数字,不需要超出最大数字所需的额外领先空间,并提供一个新示例(我之前的建议,上面的内容,没有' t匹配所需的输出)。删除对一串字符串通用的前导空格的工作最好使用 textwrap.dedent - 但是它适用于单个字符串(使用换行符),而所需的输出是字符串列表。没问题,我们只是把它们放在一起,然后再将它们分开,然后再将它们分开:

import re
import textwrap

a = [  5.50056103e+02,   6.77383566e+03,   6.01001513e+05,
         3.55425142e+08,   7.07254875e+05,   8.83174744e+02,
         8.22320510e+01,   4.25076609e+08,   6.28662635e+07,
         1.56503068e+02]

thelist = textwrap.dedent(
        '\n'.join(ut0.sub(r'\1', "%20f" % x) for x in a)).splitlines()

print '\n'.join(thelist)

发射:

      550.056103
     6773.83566
   601001.513
355425142.0
   707254.875
      883.174744
       82.232051
425076609.0
 62866263.5
      156.503068
) thelist = [ut0.sub(r'\1', "%12f" % x) for x in a] print '\n'.join(thelist)

快速而简洁,但打破了你对“现成”的限制。 - 相反,它是一般格式化的模块化组合(几乎可以实现您想要的,但留下您想要隐藏的尾随零)和RE以删除不需要的尾随零。实际上,我认为它完全符合您的要求,但我认为您所陈述的条件过度约束。

修改:编辑了原始问题以指定更多有效数字,不需要超出最大数字所需的额外领先空间,并提供一个新示例(我之前的建议,上面的内容,没有' t匹配所需的输出)。删除对一串字符串通用的前导空格的工作最好使用 textwrap.dedent - 但是它适用于单个字符串(使用换行符),而所需的输出是字符串列表。没问题,我们只是把它们放在一起,然后再将它们分开,然后再将它们分开:

<*>

发射:

<*>

其他提示

Pythons字符串格式化既可以打印出必要的小数(%g),也可以使用一组固定的小数(%f)。但是,您只想打印出必要的小数,除非数字是整数,那么您需要一个小数,这会使它变得复杂。

这意味着你最终会得到:

def printarr(arr):
    for x in array:
        if math.floor(x) == x:
            res = '%.1f' % x
        else:
            res = '%.10g' % x
        print "%*s" % (15-res.find('.')+len(res), res)

这将首先创建一个带有1个十进制的字符串,如果该值是整数,或者如果它不是小数,它将以自动小数(但最多只有10个数字)打印。最后它会打印出来,经过调整以便小数点对齐。

但是,numpy实际上可以做你想要的,因为如果它太长,你通常会希望它处于指数模式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top