Numpy和Pandas的计算有区别吗?

Ter*_*how 31 python numpy pandas

我假设我要使用Numpy数组,我写了一堆代码.原来我通过Pandas加载的数据.我现在记得我把它加载到Pandas中因为我在Numpy中加载它时遇到了一些问题.我相信数据太大了.

因此我想知道,使用Numpy和Pandas时计算能力是否存在差异?

如果Pandas效率更高,那么我宁愿为Pandas重写我的所有代码,但如果没有效率那么我只会使用一个numpy数组......

Mar*_*ark 17

可以存在显着的性能差异,乘法的数量级和索引几个随机值的多个数量级.

我实际上想知道同样的事情并且遇到了这个有趣的比较:http: //penandpants.com/2014/09/05/performance-of-pandas-series-vs-numpy-arrays/


Gau*_*rav 11

我认为更多的是根据您看到的性能,战略性地使用这两者并转移数据(从 numpy 到 Pandas,反之亦然)。作为最近的一个例子,我试图data.shape -> (10,000, 4)使用 numpy连接 4 个小泡菜文件,每个文件有 10k 行。

代码是这样的:

n_concat = np.empty((0,4))
for file_path in glob.glob('data/0*', recursive=False):
    n_data = joblib.load(file_path)
    n_concat = np.vstack((co_np, filtered_snp))
joblib.dump(co_np, 'data/save_file.pkl', compress = True)
Run Code Online (Sandbox Code Playgroud)

这坠毁我的笔记本电脑(8 GB,I5)这是令人惊讶,因为成交量是不是真的巨大的。4 个压缩的腌制文件每个大约 5 MB。

同样的事情,在熊猫上效果很好。

for file_path in glob.glob('data/0*', recursive=False):
    n_data = joblib.load(sd)
    try:
        df = pd.concat([df, pd.DataFrame(n_data, columns = [...])])
    except NameError:
        df = pd.concat([pd.DataFrame(n_data,columns = [...])])
joblib.dump(df, 'data/save_file.pkl', compress = True)
Run Code Online (Sandbox Code Playgroud)

另一方面,当我通过迭代 Pandas 数据帧来实现梯度下降时,它非常慢,而使用 numpy 来完成这项工作要快得多。

总的来说,我已经看到 Pandas 通常更适合移动/处理中等大的数据块和执行常见的列操作,而 numpy 最适合在较小的数据集上进行矢量化和递归工作(可能是数学密集型工作)。

在两者之间移动数据很容易,所以我想,战略性地使用两者是要走的路。


Mar*_*ski 7

在我对大型数字数据的实验中,Pandas 始终比 Numpy慢 20 倍。这是一个巨大的差异,因为只执行了简单的算术运算:列的切片、mean()、searchsorted() - 见下文。最初,我认为 Pandas 是基于 numpy 的,或者至少它的实现是像 numpy 一样经过 C 优化的。然而,鉴于巨大的性能差距,这些假设被证明是错误的。

在下面的示例中,data是一个有 8M 行和 3 列(int32、float32、float32)的 Pandas 框架,没有 NaN 值,列 #0(时间)被排序。data_np被创建为data.values.astype('float32'). 在 Python 3.8、Ubuntu 上的结果:

A. 列切片和 mean():

# Pandas 
%%timeit 
x = data.x 
for k in range(100): x[100000:100001+k*100].mean() 

15.8 ms ± 101 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# Numpy
%%timeit 
for k in range(100): data_np[100000:100001+k*100,1].mean() 

874 µs ± 4.34 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)

Pandas 比 Numpy 慢 18 倍(15.8 毫秒对 0.874 毫秒)。

B. 在已排序的列中搜索:

# Pandas
%timeit data.time.searchsorted(1492474643)                                                                                                                                                               
20.4 µs ± 920 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

# Numpy
%timeit data_np[0].searchsorted(1492474643)                                                                                                                                                              
1.03 µs ± 3.55 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Run Code Online (Sandbox Code Playgroud)

Pandas 比 Numpy 慢 20 倍(20.4µs 对 1.03µs)。

编辑:我实现了一个 namedarray 类,它弥补了 Pandas 和 Numpy 之间的差距,因为它基于 Numpy 的 ndarray 类,因此比 Pandas 性能更好(通常快 7 倍),并且与 Numpy'a API 及其所有运算符完全兼容;但同时它使列名与 Pandas 的 DataFrame 相似,因此对单个列的操作更容易。这是一个原型实现。不像熊猫,namedarray没有允许对不同数据类型的列。代码可以在这里找到:https : //github.com/mwojnars/nifty/blob/master/math.py(搜索“namedarray”)。