簡體   English   中英

如何像pandas數據幀一樣快速訪問numpy數組

[英]How do I access a numpy array as quickly as a pandas dataframe

我對幾種訪問DataFrame數據的方法進行了比較。 見下面的結果。 最快的訪問是在DataFrame上使用get_value方法。 我在這篇文章中提到了這一點。

令我驚訝的是,通過get_value訪問比通過底層numpy對象df.values訪問更快。

我的問題是,有沒有辦法像我可以通過get_value訪問pandas數據幀一樣快速訪問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μs

iloc很通用,接受切片和列表以及簡單的整數。 在上面的例子中,你有簡單的整數索引,pandas首先確定它是一個有效的整數,然后它將請求轉換為一個iat索引,所以很明顯它會慢得多。 iat最終解析為對get_value的調用,所以直接調用get_value會很快。 get_value本身是緩存的,因此像這樣的微基准測試可能無法反映實際代碼中的性能。

df.values確實返回一個ndarray,但只有在檢查它是一個連續的塊之后。 這需要一些查找和測試,因此它比從緩存中檢索值要慢一些。

我們可以通過每次創建一個新的數據框來打敗緩存。 這表明values訪問器是最快的,至少對於統一類型的數據:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM