访问numpy数组
我需要创建一个包含N个元素的numpy数组,但我想从一个偏移量Noff开始访问这个数组,也就是说,第一个元素应该在Noff的位置,而不是从0开始。在C语言中,这个操作很简单,只需要一些指针的计算,比如我先分配数组的内存,然后定义一个指针并适当地移动它。
而且,我不想分配N+Noff个元素,只想要N个元素。
关于numpy,我脑海中浮现出很多方法:
(1) 定义一个包装函数来访问数组
(2) 重写[]操作符
(3) 其他方法
那么,哪种方法是实现这个目标的最快方式呢?
非常感谢!
3 个回答
2
使用 A[n-offset]
。这个方法会把 offset
的值从 offset+len(A)
转换成 0
到 len(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 纳秒