【问题标题】:Why are the values always rounded when numpy arrays are involved?当涉及到 numpy 数组时,为什么值总是四舍五入?
【发布时间】:2021-08-18 23:58:55
【问题描述】:

这是我在 Python 中用作数值方法的一部分的代码,但是当计算 B[n] 并且它是小数时会出现问题。例如,如果B[n] - f * B[n-1] 的答案是-2.6,则B[n] 将改为-2。当我在print 命令上执行这个确切的命令(B[n] - f * B[n-1]) 时,它会输出-2.6

这太荒谬了,为什么会这样? Bnumpy 数组是否不接受小数作为其元素?如果是这样,我认为这绝对是荒谬的。顺便说一句,print 命令可以让我查看for 循环期间实际发生的情况,我概述了上面的发现。

for n in range(1, nt):

    f = A[n, n-1] / A[n-1, n-1]

    A[n, n] = A[n, n] - f * A[n-1, n]

    A[n, n-1] = 0
    
    print(B[n], B[n-1], f,B[n] - f * B[n-1])
    B[n] = B[n] - f * B[n-1]
    
    print(A, B, f, B[n-1], B[n])

【问题讨论】:

  • 听起来您无意中将数组定义为整数,而不是浮点数;您可以将您如何定义它们添加到您的问题中吗?
  • 解决这个问题的最基本方法是在原始定义中添加dtype=float 之类的内容(取决于您想要的类型)。通常有一些快捷方式可以让你省略它,但有时你需要编写它。如果普通的 float 没有足够的精度或不适合,它还允许您指定类型。
  • @sabik:整数数组不允许像2.6 这样的值。
  • 你是如何创建B的?
  • 迟早,您需要了解 numpy 数组有一个名为 dtype 的属性。忽略这一点,后果自负!

标签: python python-3.x numpy


【解决方案1】:

首先,问题需要包含minimal, reproducible example;我们可以将一些东西粘贴到 Python 中,它会工作,不需要额外的定义。

对于这个问题,它可能看起来像这样:

import numpy as np

B = np.array([1, 1])
f = 3.6
print(B[1] - f * B[0])  # prints out -2.6

B[1] = B[1] - f * B[0]
print(B[1])  # prints out -2; I was expecting -2.6

我们可以将其粘贴到文件或 Jupyter 笔记本或 Python 命令行中并运行它;无需额外的代码(或猜测)即可看到问题的发生。

其次,NumPy 数组(与 Python 的大多数其他部分不同)具有已定义的类型;分配给数组的单个元素会转换类型。如果我们不指定类型,NumPy 会尝试根据数据进行猜测;通常这是令人满意的,但偶尔会猜错。这里因为B的初始值都是整数,所以猜测我们希望B包含整数类型。

两种方法解决:

  • 帮它猜对:B = np.array([1.0, 1.0])

    这既快速又简单,并且可以跨上下文、库甚至编程语言移植;它可以在任何地方工作,而无需查找如何指定类型。

  • 告诉它我们想要什么:B = np.array([1, 1], dtype=float)

    如果数据来自程序的其他地方并且我们不能轻易更改它,这是唯一的方法;如果我们特别关注类型,例如如果我们想要更多(或更少)精度;或者,如果我们使用像 np.zeros 这样的函数,它不会获取任何数据来猜测。

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多