python - np.round 或 np.around 不起作用

标签 python arrays numpy

我有这个数组:

arr = np.array([66.5, 89.4000015, 57.2000008, 86.9000015, 64.5999985,
      92.3000031, 74.1999969, 76.0999985, 92.0999985, 81.6999969,
      72.0999985, 78.8000031, 81.4000015, 95.4000015, 73.5      ,
      58.5999985, 68.3000031, 68.9000015, 68.6999969, 92.       ])

我尝试对每个数字进行四舍五入,并使用了np.around:

[in]  np.around(arr, 2)

[out] array([66.5, 89.4, 57.2, 86.9, 64.6, 92.3, 74.2, 76.1, 92.1, 81.7, 72.1,
   78.8, 81.4, 95.4, 73.5, 58.6, 68.3, 68.9, 68.7, 92. ])

[in]  np.around(arr, 4)

[out] array([66.5, 89.4, 57.2, 86.9, 64.6, 92.3, 74.2, 76.1, 92.1, 81.7, 72.1,
   78.8, 81.4, 95.4, 73.5, 58.6, 68.3, 68.9, 68.7, 92. ])

[in] np.around(arr, 5)
[out] array([66.5, 89.4, 57.2, 86.9, 64.6, 92.3, 74.2, 76.1, 92.1, 81.7, 72.1,
   78.8, 81.4, 95.4, 73.5, 58.6, 68.3, 68.9, 68.7, 92. ])

[in]  np.around(arr, 6)

[out] array([66.5     , 89.400002, 57.200001, 86.900002, 64.599998, 92.300003,
   74.199997, 76.099998, 92.099998, 81.699997, 72.099998, 78.800003,
   81.400002, 95.400002, 73.5     , 58.599998, 68.300003, 68.900002,
   68.699997, 92.      ])

当小数位数小于5时,np.around()不起作用。当它大于 6 时,np.around 运行良好。

感谢任何帮助。

安妮

最佳答案

如何:圆

根据您所描述的“意外行为”,我相信您还不清楚是哪一轮操作或它们对数字的影响或如何将 float 格式化为字符串。

让我们探讨一下四舍五入到 n=4 位不同值时的差异。

基线

我们定义了一个包含 13 个值的数组(13 个只是为了得到一些数字),从 0 到 1。

values = np.linspace(0, 1, 13)

数组包含:

array([0.        , 0.08333333, 0.16666667, 0.25      , 0.33333333,
       0.41666667, 0.5       , 0.58333333, 0.66666667, 0.75      ,
       0.83333333, 0.91666667, 1.        ])

numpy.around

numpy.around 当第 n+1 个大于或等于 5 时,将增加第 n 个数字的值,否则不执行任何操作。它与 numpy.round 相同。

np.round(values, n)
>>> array([0.    , 0.0833, 0.1667, 0.25  , 0.3333, 0.4167, 0.5   , 0.5833,
   0.6667, 0.75  , 0.8333, 0.9167, 1.    ])

numpy.ceil

numpy.ceil 整数部分存在数字时增加值,舍去数字。

np.ceil(r)
>>> array([0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

numpy.floor

numpy.floor 只会丢弃数字。

np.floor(r)
>>> array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.])

Number string formatting

有多种方法可以将数字格式化为字符串:我们将探索一些更常用的方法。

格式化为 float

要格式化 float ,您可以使用符号 .nf,其中 n 是您要保留的位数。它将删除所有以下数字并在需要时添加零作为填充。

[ "{:0.4f}".format(v) for v in r]
>>> ['0.0000', '0.0833', '0.1667', '0.2500', '0.3333', '0.4167', '0.5000',
     '0.5833', '0.6667', '0.7500', '0.8333', '0.9167', '1.0000']

格式化为百分比

要将 float 格式化为百分比,您可以使用符号 .n%,其中 n 是您要保留的位数,考虑到该数字将乘以100。它将删除所有以下数字并在需要时添加零作为填充。

[ "{:0.4%}".format(v) for v in r]
>>> ['0.0000%', '8.3333%', '16.6667%', '25.0000%', '33.3333%', '41.6667%',
'50.0000%', '58.3333%', '66.6667%', '75.0000%', '83.3333%', '91.6667%',
'100.0000%']

科学记数法格式

要将 float 格式化为百分比,您可以使用符号 .ne,其中 n 是您要保留的位数,考虑到该数字将被转换为 scientific notation .它将删除所有以下数字并在需要时添加零作为填充,在末尾添加科学记数法中数字的指数。

[ "{:e}".format(v) for v in r]
>>> [
    '0.0000e+00', '8.3333e-02', '1.6667e-01', '2.5000e-01', '3.3333e-01',
    '4.1667e-01', '5.0000e-01', '5.8333e-01', '6.6667e-01', '7.5000e-01',
    '8.3333e-01', '9.1667e-01', '1.0000e+00'
]

奖励:格式化复数

假设您有一个复数a = 3j+2:要打印它的分量,您可以通过访问它的属性来继续:

"The real component is {0.real} and the imaginary one is {0.imag}".format(a)
>>> 'The real component is 2.0 and the imaginary one is 3.0'

关于python - np.round 或 np.around 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51349738/

相关文章:

python - 使用python,如果该行中存在特定字符,如何删除csv文件中的整行?

javascript - 在 Angular 中显示数组内部的对象

java - 每个按钮的 ActionListener 都有不同的变量

python - 将 3D 列表转换为 3D NumPy 数组

python - 有效地获取 3D 阵列中堆叠图像的图像边界

python - 如何重构 GWBASIC 代码中的 GOTO 语句?

python - 非阻塞子进程并捕获每个子进程的输出

python - PyAutoGUI 截图我唯一的背景(Mac OS)

arrays - 使用 Swift 的 POST 请求中的数组

python-3.x - 从文件加载数据并标准化