Python 是否可以使用numba输出2列,并将其用作2个新列

Python 是否可以使用numba输出2列,并将其用作2个新列,python,pandas,function,numpy,numba,Python,Pandas,Function,Numpy,Numba,我试图使用numba来减少250k行的运行时间,这可以使用df.loc来完成,因为当我使用df.loc时,运行递归输入和输出会花费很多时间 这是我的输入 input 1 2 3 4 以及所需的输出“a”和“b” inputa a b 1 0 0 2 2 3 3 5 7 4 9 12 基本上,“a”和“b”的初始值为0 a = previous value of 'a' + current value of inp

我试图使用numba来减少250k行的运行时间,这可以使用df.loc来完成,因为当我使用df.loc时,运行递归输入和输出会花费很多时间

这是我的输入

input
1
2
3
4
以及所需的输出“a”和“b”

inputa  a    b
1       0    0
2       2    3
3       5    7
4       9    12
基本上,“a”和“b”的初始值为0

a = previous value of 'a' + current value of inputa 
b=输入的先前值+a当前值

我现在的代码是这个

@jit(nopython=True)
def foo(inputa):
    a = np.zeros(inputa.shape)
    b = np.zeros(inputa.shape)
    a[0] = 0
    b[0] = 0
    for i in range(1, a.shape[0]) :
        a[i] = a[i-1] + inputa[i]
        b[i] = inputa[i-1] + a[i]
    return a, b
 
df[['a','b']] = foo(df['inputa'].values)     
print(df)
但是,我遇到了这个错误

TypingError: cannot determine Numba type of <class 'method'>
但是,如果我尝试进行两列输出/结果,我会遇到问题。基本上,我想使用df.loc执行多个递归列w/o

请告知


非常感谢。

您的方法很好,除了在
b[i]=input[i-1]+a[i]
中有一个打字错误,因为@Jérôme Richard正确地提到了
input
,这是python中的一个内置方法

import numba as nb
import numpy as np
import pandas as pd

# DataFrame
df = pd.DataFrame(np.arange(1,101),columns=['data'])
df_vals = df.values.ravel() # .ravel to unfold a 2d array into 1d array


# Regular Python Function
def foo(arr):
    arrlen = arr.shape[0]
    a = np.zeros(arrlen)
    b = np.zeros(arrlen)
    for i in range(1, a.shape[0]) :
        a[i] = a[i-1] + arr[i]
        b[i] = arr[i-1] + a[i]
    return a, b

# Jitted (nopython) Function
foo_nb = nb.njit()(foo)


# Numba Warmup
_ = foo_nb(df_vals)


a_vals, b_vals = foo_nb(df_vals)

df['a'] = a_vals
df['b'] = b_vals

# Performance Benchmarks *NOTE : To be used in Jupyter Notebook.
print('Non Numba Code Performance : ')
foo_timeit = %timeit -o -n 1000 foo(df_vals)
print('\nNumba Code Performance : ')
foo_nb_timeit = %timeit -o -n 1000 foo_nb(df_vals)
输出:

Non Numba Code Performance : 
289 µs ± 11.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Numba Code Performance : 
1.22 µs ± 174 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

使用
input
时要小心,因为这是内置程序的名称。如果我尝试执行两列输出/结果,您所说的
是什么意思?你试过什么?请通过编辑问题来回答。我编辑了问题。谢谢你的建议。谢谢你的帮助。看来你正击中我想做的事。只是几个问题。我在%timeit中有一个错误。我需要先导入一些东西才能这样做吗?我是python新手,我只是通过研究我想做的类似问题来学习的,所以我不熟悉.ravel语法。你能给我更多的启发吗?另一个问题是,如何将这两个数组a和b放入panda列中。如果我试图使用
df['a','b']]=foo_nb(df_vals)
,我会出现此错误
“[Index(['a','b'],dtype='object')]中没有一个在[columns]中。”。谢谢,你的帮助太多了。答案更新了,看看变化。哦,哇,非常感谢。我现在明白了。帮了大忙。
Non Numba Code Performance : 
289 µs ± 11.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Numba Code Performance : 
1.22 µs ± 174 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)