如何在Python指针中迭代数组 - 可能有效?

时间:2015-07-18 02:57:12

标签: python c++ arrays numpy pandas

我是Python的新手,我想迭代一个数组来根据前面的元素计算下一个元素。我可以用C ++方式来思考这个,但是如何使用Numpy或Pandas在Python中实现这一点?我知道类似的方法是使用移位,但这种方式看起来效率不高。

以下是一个简单的Fibonacci示例:

int arr[10];
arr[0] = 1;
arr[1] = 1;

int* pt = &arr[2];         <--get a iterator like a moving pointer
int count = 8;
while (count > 0)
{
    *pt = pt[-1] + pt[-2]; <--access previous k element based on current index
    count--;
    pt++;                  <--point to next element
}
for (int i = 0; i < 10; i++)
    cout << arr[i] << endl;

列表:

L = [1, 1]
while len(L) != 10:
    L.append(L[-1] + L[-2]) <--But I have to append element every time
print L

1 个答案:

答案 0 :(得分:2)

C ++的直接numpy模仿是

arr=np.ones((10,))
for i in range(2,arr.shape[0]):
     arr[i]=arr[i-1]+arr[i-2]
制造

array([  1.,   1.,   2.,   3.,   5.,   8.,  13.,  21.,  34.,  55.])

这可能不是在numpy中执行此操作的最有效方法,但它是讨论的开始。

大多数快速numpy操作使用已编译的c代码,并且结果是缓冲的,因此执行快速顺序操作很棘手。最好考虑同时在阵列的所有条件上并行执行numpy操作(不需要任何顺序)。例外情况为ufunc cumsumcumprod - 累积流程,以及名为ufunc的无缓冲at。我必须四处游戏,看看是否有办法用这些工具之一来计算这个系列。

另一种选择是用C或C ++实现计算并链接它。 cython是执行此操作的最便捷工具。

http://wiki.scipy.org/Cookbook/Ctypes#head-6a582bd7b101bca0df6e5631a06e2d1d76e35a95 是使用ctypesc代码与numpy计算Fibonachi的示例。

http://numpy-discussion.10968.n7.nabble.com/vectorizing-recursive-sequences-td35532.html 描述了计算这个系列的一种切割方式。这取决于ufunc采用out数组。作者承认它还取决于实现细节,特别是计算没有缓冲。

arr=np.ones((10,))
np.add(arr[:-2], arr[1:-1], out=arr[2:])

前两个参数的元素逐个元素地添加,并存储在out数组中。

arr[2:] = arr[:-2]+arr[1:-1]
由于缓冲

无法正常工作

http://docs.cython.org/src/tutorial/cython_tutorial.html#fibonacci-fun

是斐波那契的Cython示例。它应该很快,但它只打印结果,而不是将它们累积在一个数组中。仍然不难做到将结果存储在cython数组或内存视图中的Cython / c版本。

这是一个cython脚本,可以保存为pyx,编译和导入。它可以被提炼为有用性和速度,但它足以测试这个概念:

import numpy as np
narr = np.ones((10,), dtype=np.dtype("i"))
cdef int [:] narr_view = narr

cpdef void fib(int[:] arr):
    I = arr.shape[0]
    for i in range(2,I):
        arr[i] = arr[i-2]+arr[i-1]
fib(narr_view)
print 'fib arr:', narr