这应该很容易。
这是我的数组(更确切地说,是生成代表性测试数组的方法):
>>> 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
我想把pad放在左边的和右边的之间(但不超过必要的范围)。
我想在小数点后加一个零,如果这就是小数点后的全部。
我不想要科学记数法。
…我不想丢失任何有效数字。(在353.9800000000002中,2不重要)
是啊,很高兴。。
Python 2.5的%g, %fx.x
等要么让我困惑,要么做不到。
我还没有试过import decimal
。我看不出NumPy也这样做(尽管array.__str__
和array.__repr__
是十进制对齐的(但有时返回科学值)。
哦,速度很重要。我在处理大数组。
我目前的解决方法是:
似乎应该有现成的解决方案。。。(但不是必需的)
当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
很抱歉,经过彻底的调查,我无法找到任何方法来执行您需要的任务,而不需要最少的后处理(去掉您不想看到的尾随零);例如:
它是一个模块化的组合,由通用格式(它几乎可以满足您的要求,但是留下您想要隐藏的尾随零)和一个RE来删除不需要的尾随零。实际上,我认为它完全符合你的要求,但我认为,你所说的条件过于有限。
编辑:对原始问题进行了编辑,以指定更有效的数字,不需要超出最大数字所需的额外前导空格,并提供了一个新的示例(上面我的建议与所需的输出不匹配)。删除一组字符串共有的前导空格的工作最好使用textwrap.dedent来执行,但这只适用于单个字符串(使用换行符),而所需的输出是字符串列表。没问题,我们只是把线拼起来,分开,然后再分开:
发射:
Pythons字符串格式既可以只输出必要的小数(带%g),也可以使用固定的小数集(带%f)。但是,您只想打印出必要的小数,除非数字是整数,那么您需要一个小数,这使它变得复杂。
这意味着你最终会得到如下结果:
这将首先创建一个字符串,如果该值是整数,则为1个十进制数;如果该值不是小数,则为自动小数(但最多只能打印10个数字)。最后,它将打印它,调整使小数点对齐。
不过,也许numpy实际上做了你想要的事情,因为如果它太长的话,你通常希望它处于指数模式。
相关问题 更多 >
编程相关推荐