我是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
答案 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
cumsum
和cumprod
- 累积流程,以及名为ufunc
的无缓冲at
。我必须四处游戏,看看是否有办法用这些工具之一来计算这个系列。
另一种选择是用C或C ++实现计算并链接它。 cython
是执行此操作的最便捷工具。
http://wiki.scipy.org/Cookbook/Ctypes#head-6a582bd7b101bca0df6e5631a06e2d1d76e35a95
是使用ctypes
和c
代码与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