Python:如何使用1个lambda函数执行多个float格式化

时间:2014-01-09 12:35:34

标签: python numpy lambda

我有一个numpy数组     [2.15295647e + 01,8.12531501e + 00,3.97113829e + 00,1.00777250e + 01] 并希望格式化它,使它看起来像这样     [21.53,08.13,03.97,10.08]

float_formatter = lambda x: "%.2f" % x
np.set_printoptions(formatter={'float_kind':float_formatter})

如何调整此项以包含2次浮动操作?

我需要像%02d%。2f%(x,y)这样的东西,但不知道如何更改lambda函数来执行此操作。

3 个答案:

答案 0 :(得分:1)

如果你想在lambda中使用两个浮点数,你需要两个输入参数:

float_formatter = lambda x, y: "%.2f %.2f" % (x, y)

您可以为lambda表达式定义多个输入,而不仅仅是单个输入,名称是任意的。不同的参数名称也是如此。

float_formatter = lambda float_one, float_two: "%.2f %.2f" % (float_one, float_two)

答案 1 :(得分:1)

据我所知,您只需要用两个前导零填充数组值并打印到两个小数位。您需要做的就是修改格式化字符串:

In [1]: "%05.2f" %np.pi
Out[1]: '03.14'

要解决此问题,5表示格式化字符串的总长度为5个字符(包括小数点),0表示您要使用前导零填充,以及.2表示您希望小数点后面有两个数字。

所以如果你想要,比如3个前导零和4个小数位,你会这样做:

In [2]: "%08.4f" %np.pi
Out[2]: '003.1416

如果您只想填充前导空格而不是零,则可以省略总长度前面的0

In [3]: "%8.4f" %np.pi
Out[3]: '  3.1416'

您可以在table of conversion flags here中了解其他选项。

要将其设置为新的格式化程序,您只需执行以下操作:

In [4]: float_formatter = lambda x: "%05.2f" %x

In [5]: np.set_printoptions(formatter={'float_kind':float_formatter})

答案 2 :(得分:0)

要更改列表中的值,您可以使用列表推导。 Python 3示例如下。

import numpy as np

precision = 2
formatter = "{0:."+str(precision)+"f}"

a = np.array([2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01])
aFormat = np.array([float(formatter.format(i)) for i in a])
print(a, aFormat)

我首先尝试了癫痫鱼的选项,但是打印机功能没有给你一个阵列。它只是给你一个浮动。因此,如果您真的想要更改2d numpy矩阵的打印选项,则必须使用外部计数器定义自己的函数,以确定格式化哪个值。下面的示例显示了这个类,因为您不希望外部计数器是全局的。

import numpy

class npPrint(object):
    def __init__(self):
        self.counter = 0
        self.precision = 2
    # end Constructor

    def printer(self, x):
        self.precision = 2
        if self.counter == 0:
            formatter = "{0:."+str(self.precision)+"f}"
            self.counter += 1
        else:
            formatter = "{0:0"+str(self.precision)+"d}"
            x = int(round(x))
            self.counter = 0

        return formatter.format(x)
    # end printer

formatter = npPrint()
a = numpy.array([[2.15295647e+01, 8.12531501e+00], [3.97113829e+00, 1.00777250e+01]])

numpy.set_printoptions(formatter={"float_kind": lambda x, f=formatter: f.printer(x)})

print(a)

你必须有一个计数器,因为你不知道你是否交了x值或y值。你只是收到一个浮动。这真的很难看。如果我是你,我会自己处理打印并拆分2d矩阵。