如何舍入一个numpy vectorize函数返回列表?

时间:2017-05-18 13:15:28

标签: python arrays numpy

我正在为我的函数使用numpy.vectorize()以便将函数应用于数组,它工作正常:

X = [-10000, -1000, -100, -10, -1, 0, 1, 10, 100, 1000, 10000]
def softplus(x):
    return np.logaddexp(1.0,x)
y=numpy.vectorize(softplus)

问题是我想在结果列表中使用numpy.around()将小数位数舍入为四,但不会影响print结果。

result = y(X)
print(numpy.around(result, decimals=4))

输出

[  1.00000000e+00   1.00000000e+00   1.00000000e+00   1.00000000e+00 ...]

2 个答案:

答案 0 :(得分:2)

这里你不需要vectorize,因为np.logaddexp已经是一个矢量化函数(就像np.around一样)。但vectorize给出了正确的结果:

>>> np.logaddexp(1.0, X)
array([  1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
         1.00001670e+00,   1.12692801e+00,   1.31326169e+00,
         1.69314718e+00,   1.00001234e+01,   1.00000000e+02,
         1.00000000e+03,   1.00000000e+04])

np.around也正确地舍入了结果:

>>> np.around(np.loagaddexp(1.0, X))
array([  1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
         1.00000000e+00,   1.12690000e+00,   1.31330000e+00,
         1.69310000e+00,   1.00001000e+01,   1.00000000e+02,
         1.00000000e+03,   1.00000000e+04])

但如果您只想显示4位小数,则需要使用其他内容,例如np.array2string

>>> print(np.array2string(np.logaddexp(1., X), precision=4))
[  1.0000e+00   1.0000e+00   1.0000e+00   1.0000e+00   1.1269e+00
   1.3133e+00   1.6931e+00   1.0000e+01   1.0000e+02   1.0000e+03
   1.0000e+04]

如果您想显示4小数,可以使用自定义格式化程序:

>>> print(np.array2string(np.logaddexp(1., X), formatter={'float': '{:.4f}'.format}))
[1.0000 1.0000 1.0000 1.0000 1.1269 1.3133 1.6931 10.0001 100.0000
 1000.0000 10000.0000]

或使用seperator

>>> print(np.array2string(np.logaddexp(1., X), 
...                       formatter={'float': '{:.4f}'.format}, 
...                       separator=', '))
[1.0000, 1.0000, 1.0000, 1.0000, 1.1269, 1.3133, 1.6931, 10.0001, 100.0000,
 1000.0000, 10000.0000]

答案 1 :(得分:0)

请注意,print语句不同,您可以通过打印结果而不使用round()语句,检查结果[7]。 e + 01意味着* 10等等。