为什么当涉及numpy数组时,值总是四舍五入?



这是我在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])

首先,问题需要包含一个最小的、可重复的例子;我们可以把它粘贴到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这样的函数,它不需要任何数据来猜测。

最新更新