为什么ndarray允许浮点索引

11 投票
4 回答
7579 浏览
提问于 2025-04-17 08:24

请问一下,为什么ndarray允许使用浮点数作为索引来访问数据,这是什么意思呢?

>>> wk1 = numpy.arange(10)
>>> wk1[1:2.8]
array([1])
>>> wk1 = [1,2,3,4,5,6,7,8,9,10]
>>> wk1[1:2.8]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: slice indices must be integers or None or have an __index__ method
>>>

4 个回答

3

基本上,对于numpy数组来说,任何不是整数的输入都会被转换成整数,也就是向下取整。比如说,1.999会变成1,等等。

例如:

import numpy as np
x = np.arange(10)

print x[1.9]
print x[2.1]

(注意,这和x[1]x[2]是一样的。)

这同样适用于用作索引的列表或数组:

print x[[1.2, 3.4]]
6

从1.12版本开始,在ndarray中使用浮点数作为索引是不被允许的,这会导致错误。

IndexError: only integers, slices (`:`), ellipsis (`...`),
    numpy.newaxis (`None`) and integer or boolean arrays are valid indices

如果你用浮点数来索引,比如说 a[0, 0.0],会出现 IndexError 错误。(查看1.11版本更新说明

同样地,用浮点数索引会引发 IndexError 错误,比如 a[0, 0.0]。(查看1.12版本更新说明

(我强调的)

5

这段话提到了一种很有用的功能,我也在想为什么其他类没有像numpy那样做。

我特别注意到这个功能的一个场景是,当你的numpy数组是一个图像时。如果你有一个处理鼠标点击事件的程序,它会给你返回event.xdataevent.ydata这两个浮点数,那么你就可以直接用切片来获取感兴趣的区域,而不需要把它们转换成像素坐标。举个例子,假设你想通过点击和拖动来裁剪或放大图像——在这种情况下,鼠标在图像上的位置通常会是亚像素坐标,只有在图像以1:1的比例显示时才会是整数坐标。

顺便提一下,非整数的切片表示法(甚至在切片中使用复数)可以在它们的索引技巧类r_c_中使用,比如:

>>>np.r_[0:3:0.1]
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ,
        1.1,  1.2,  1.3,  1.4,  1.5,  1.6,  1.7,  1.8,  1.9,  2. ,  2.1,
        2.2,  2.3,  2.4,  2.5,  2.6,  2.7,  2.8,  2.9])

>>>np.c_[-1:1:9j]
array([[-1.  ],
       [-0.75],
       [-0.5 ],
       [-0.25],
       [ 0.  ],
       [ 0.25],
       [ 0.5 ],
       [ 0.75],
       [ 1.  ]])

撰写回答