当前位置: 首页 > 知识库问答 >
问题:

如何像访问熊猫数据帧一样快速地访问numpy数组

太叔志尚
2023-03-14

我对访问数据帧中的数据的几种方法进行了比较。请参阅下面的结果。最快的访问是在数据帧上使用get_value方法。在这篇文章中提到了我。

令我惊讶的是,通过get_value访问比通过底层的 numpy 对象 df.values 访问更快。

我的问题是,有没有一种方法可以像我通过< code>get_value访问熊猫数据帧一样快速地访问numpy数组的元素

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(16).reshape(4, 4))
%%timeit
df.iloc[2, 2]

10000个回路,最佳3:108µs/回路

%%timeit
df.values[2, 2]

最慢的运行时间是最快的5.42倍。这可能意味着正在缓存中间结果。100000个循环,每个循环最好为3:8.02µs

%%timeit
df.iat[2, 2]

最慢的运行时间是最快的4.96倍。这可能意味着正在缓存中间结果。100000个循环,每个循环最好为3:9.85µs

%%timeit
df.get_value(2, 2)

跑得最慢的人比跑得最快的人多花了19.29倍的时间。这可能意味着正在缓存中间结果。100000次循环,3次最佳:每次循环3.57秒

共有1个答案

黄宏大
2023-03-14

< code>iloc非常通用,接受切片和列表以及简单的整数。在上面的例子中,您有一个简单的整数索引,pandas首先确定它是一个有效的整数,然后它将请求转换成一个< code>iat索引,所以很明显它会慢很多。< code>iat最终解析为对< code>get_value的调用,因此直接调用< code>get_value自然会很快。< code>get_value本身是缓存的,所以像这样的微基准可能不能反映真实代码的性能

df.values 确实返回一个 ndarray,但只有在检查它是单个连续块之后。这需要一些查找和测试,因此比从缓存中检索值慢一点。

我们可以通过每次创建一个新的数据帧来击败缓存。这表明访问器最快,至少对于统一类型的数据:

In [111]: %timeit df = pd.DataFrame(np.arange(16).reshape(4, 4))
10000 loops, best of 3: 186 µs per loop

In [112]: %timeit df = pd.DataFrame(np.arange(16).reshape(4, 4)); df.values[2,2]
1000 loops, best of 3: 200 µs per loop

In [113]: %timeit df = pd.DataFrame(np.arange(16).reshape(4, 4)); df.get_value(2,2)
1000 loops, best of 3: 309 µs per loop

In [114]: %timeit df = pd.DataFrame(np.arange(16).reshape(4, 4)); df.iat[2,2]
1000 loops, best of 3: 308 µs per loop

In [115]: %timeit df = pd.DataFrame(np.arange(16).reshape(4, 4)); df.iloc[2,2]
1000 loops, best of 3: 420 µs per loop

In [116]: %timeit df = pd.DataFrame(np.arange(16).reshape(4, 4)); df.ix[2,2]
1000 loops, best of 3: 316 µs per loop

该代码声称ix是最通用的,因此理论上应该比iloc;可能您的特定测试支持ix,但其他测试可能支持iloc只是因为将索引标识为标量索引所需的测试顺序。

 类似资料:
  • 如何通过键访问Groupby对象中相应的Groupby数据框? 使用以下groupby: 我可以迭代它来获取密钥和组: 我想能够访问一个组的关键: 但是当我试着用这样做时,我得到了一个奇怪的对象,它似乎没有任何与我想要的数据帧对应的方法。 我能想到的最好的办法是: 但是考虑到熊猫在这些事情上通常有多好,这有点令人讨厌。 这样做的内置方法是什么?

  • 问题内容: 考虑这个简单的例子 我想编写一个以数据框和列为输入的函数。 现在这有效: 这也适用: 但这 失败了 怎么了 我担心使用某些 链接 可能会产生一些细微的错误(https://pandas.pydata.org/pandas- docs/stable/indexing.html#why-does-assignment-fail-when-using-chained- indexing )

  • 问题内容: 在php中,我经常需要使用数组来映射变量…但是我似乎无法在一个内衬中做到这一点。cf范例: 这是一个小问题,但有时会不时出现错误……我不喜欢这样的事实,我什么都不用使用变量;) 问题答案: 我真的不会去理会这个额外的变量。但是,如果需要,也可以在使用后将其从内存中删除: 或者,您可以编写一个小函数: 并使用以下命令调用: 现在应该自动销毁该阵列。

  • 如何将pandas数据帧(21 x 31)转换为numpy数组? 例如: 数组_1(n_1,n_2,n_3,…,n31) 数组_2(n_1,n_2,n_3,…,n31) 数组21(n_1,n_2,n_3,…,n31) 我尝试了以下代码段: .. 并得到如下结果: 问题是第二个方括号太多了。我该如何解决这个问题?

  • 问题内容: Core Audio具有C API,可将一些数据复制到您提供的内存中。在一种情况下,我需要传递一个指向AudioBufferList的指针,该指针定义为: UInt32标识缓冲区的数量,并且实际缓冲区紧随其后。 我可以成功获得此: 我无法识别(AudioBuffer)语法,但我认为它并不重要- 我认为括号会被忽略,mBuffers只是一个AudioBuffer,由我自己完成指针数学运算

  • 假设熊猫数据帧如下所示: 如何将第三行(如row3)提取为pd数据帧?换句话说,row3.shape应该是(1,5),row3.head()应该是: