为什么numpy.r_在构造数组时有时包含端点,有时不包含?

dw1jzc5e  于 2022-12-13  发布在  其他
关注(0)|答案(2)|浏览(103)

numpy.r_可用于从切片表示法快速生成数组。但是,以下示例似乎演示了不一致的行为:

>>> import numpy as np

>>> a = np.r_[0.1 : 0.3 : 0.1]
>>> a
array([0.1, 0.2])

未包括切片0.3的端点-如预期。

>>> b = np.r_[0.1 : 0.4 : 0.1]
>>> b
array([0.1, 0.2, 0.3, 0.4])

包括切片0.4的端点!
似乎没有对documentation中的此行为的解释。

bvn4nwqk

bvn4nwqk1#

c为真实的时,numpy.r_[a:b:c]等价于numpy.arange(a, b, c)。这里使用浮点数是一个坏主意,如numpy.arange docs中所述-长度可能是错误的,因为基于浮点值的长度计算会出现浮点舍入错误,并且由于NumPy如何在内部处理步长的实现细节,步长本身可能会遭受精度损失。
正如numpy.arange文档中所建议的那样,您应该使用numpy.linspacenumpy.linspace将元素计数作为整数,而不是一个步骤:

b = numpy.linspace(0.1, 0.4, num=3, endpoint=False)
6qfn3psc

6qfn3psc2#

因为在python中真实的并不总是四舍五入的,就像你的例子中,水平步长0.2+0.1接近0.30000000000000004,结果会是错误的。我会使用这种方法,但它看起来更复杂:

from decimal import *
import numpy as np
getcontext().prec = 6 # setting new values for precision, rounding, or enabled traps
b = Decimal(2)/Decimal(5) # 0.4
a = Decimal(1)/Decimal(10) # 0.1
print(np.r_[a: b : a])

相关问题