访问numpy数组

1 投票
3 回答
2304 浏览
提问于 2025-04-16 22:08

我需要创建一个包含N个元素的numpy数组,但我想从一个偏移量Noff开始访问这个数组,也就是说,第一个元素应该在Noff的位置,而不是从0开始。在C语言中,这个操作很简单,只需要一些指针的计算,比如我先分配数组的内存,然后定义一个指针并适当地移动它。

而且,我不想分配N+Noff个元素,只想要N个元素。

关于numpy,我脑海中浮现出很多方法:

(1) 定义一个包装函数来访问数组

(2) 重写[]操作符

(3) 其他方法

那么,哪种方法是实现这个目标的最快方式呢?

非常感谢!

3 个回答

2

使用 A[n-offset]。这个方法会把 offset 的值从 offset+len(A) 转换成 0len(A) 之间的值。

2

我建议你在通过 __getitem__() 方法重写 [] 操作符时要非常小心。虽然在你自己的代码里这样做没问题,但我可以想象,当这个数组被传递给某个不确定的库函数时,可能会出现问题。

举个例子,如果这个函数明确地想要获取数组中的所有值,比如 A[0:-1],那么它会变成 A[offset:offset-1]。对于任何正数或负数的 offset 值,这个结果都会是一个空数组。虽然这个例子有点牵强,但它说明了一个普遍的问题。

所以,我建议你为自己的使用创建一个包装函数(作为成员函数可能最方便),但不要去改动 __getitem__()

1

你已经提到了(1)和(2)这两种方法,它们都算是比较合理的选择。要测试这些方法的速度,可以试试在 ipython 中使用 timeit 这个神奇的函数。下面是一个使用的例子:

A = array(range(10))
Noff = 2
wrapper_access = lambda i: A[i - Noff]
print wrapper_access(2)   #0
print wrapper_access(11)  #9
print wrapper_access(1)   #9 = A[-1]
timeit wrapper_access(5)

在我的电脑上,使用 timeit 的结果是 10000000 次循环,最佳结果为 3 次:每次循环 193 纳秒

撰写回答