numpy.r_构造数组时为何有时包含端点有时不包含?
numpy.r_切片端点包含行为的不一致性
numpy.r_支持用切片语法快速构造数组,但实际使用中会出现端点包含行为不一致的情况:
import numpy as np a = np.r_[0.1 : 0.3 : 0.1] print(a) # 输出:array([0.1, 0.2])
这里切片端点0.3未被包含,符合常规切片“左闭右开”的预期。
但换一个端点后:
b = np.r_[0.1 : 0.4 : 0.1] print(b) # 输出:array([0.1, 0.2, 0.3, 0.4])
端点0.4却被包含了,这种不一致性容易让人困惑。
原因解析
这本质是浮点数精度误差和numpy内部数组生成逻辑共同导致的。numpy.r_的切片模式底层依赖类似np.arange()的实现逻辑:从起始值开始,不断累加步长,直到下一个值超过终止值时停止。但由于0.1这类十进制小数无法在二进制浮点数中精确表示,累加过程中会产生微小的精度偏差:
- 当终止值是0.3时,
0.1 + 0.1 + 0.1的实际存储值会略大于0.3,因此不会被包含在结果中; - 当终止值是0.4时,
0.1 * 4的实际存储值恰好处于numpy的精度容忍范围内,被判定为未超过终止值,因此这个值会被保留在结果数组里。
解决方案
如果需要严格的“左闭右开”行为,建议:
- 使用
np.linspace()生成数组后手动排除端点; - 将数值转换为精确的小数类型(比如
decimal.Decimal)后再处理。
内容的提问来源于stack exchange,提问作者apsis73
相关产品推荐
相关产品推荐

