![](/img/trans.png)
[英]Is there a way to vectorize counting items' co-occurences in pandas/numpy?
[英]Python: faster way of counting occurences in numpy arrays (large dataset)
我是Python的新手。 我有一個numpy.array
,大小是66049x1
(66049行和1列)。 值從最小到最大排序,並且是float
類型,其中一些是重復的。
我需要確定每個值的出現頻率(給定值等於但未超過的次數 ,例如統計術語中X <= x ),以便稍后繪制樣本累積分布函數。
我目前使用的代碼如下,但它非常慢,因為它必須循環66049x66049=4362470401
次。 有沒有辦法增加這段代碼的速度? 也許使用dictionaries
會有什么幫助嗎? 不幸的是,我無法改變我正在使用的數組的大小。
+++Function header+++
...
...
directoryPath=raw_input('Directory path for native csv file: ')
csvfile = numpy.genfromtxt(directoryPath, delimiter=",")
x=csvfile[:,2]
x1=numpy.delete(x, 0, 0)
x2=numpy.zeros((x1.shape[0]))
x2=sorted(x1)
x3=numpy.around(x2, decimals=3)
count=numpy.zeros(len(x3))
#Iterates over the x3 array to find the number of occurrences of each value
for i in range(len(x3)):
temp=x3[i]
for j in range(len(x3)):
if (temp<=x3[j]):
count[j]=count[j]+1
#Creates a 2D array with (value, occurrences)
x4=numpy.zeros((len(x3), 2))
for i in range(len(x3)):
x4[i,0]=x3[i]
x4[i,1]=numpy.around((count[i]/x1.shape[0]),decimals=3)
...
...
+++Function continues+++
你應該使用np.where
然后計算獲得的索引向量的長度:
indices = np.where(x3 <= value)
count = len(indices[0])
import numpy as np
import pandas as pd
from collections import Counter
import matplotlib.pyplot as plt
arr = np.random.randint(0, 100, (100000,1))
df = pd.DataFrame(arr)
cnt = Counter(df[0])
df_p = pd.DataFrame(cnt, index=['data'])
df_p.T.plot(kind='hist')
plt.show()
對於( 100,000x1)
數組,整個腳本花了很短的時間來執行(~2s)。 我沒有時間,但如果你提供你做的時間我們可以比較。
我使用collections
[Counter][2]
來計算出現次數,我對它的體驗總是很棒(時間上)。 我將其轉換為DataFrame
以繪制並使用T
進行轉置。
您的數據確實會復制一些,但您可以嘗試進一步優化它。 事實上,它非常快。
編輯
使用cumsum()
創建CDF
import numpy as np
import pandas as pd
from collections import Counter
import matplotlib.pyplot as plt
arr = np.random.randint(0, 100, (100000,1))
df = pd.DataFrame(arr)
cnt = Counter(df[0])
df_p = pd.DataFrame(cnt, index=['data']).T
df_p['cumu'] = df_p['data'].cumsum()
df_p['cumu'].plot(kind='line')
plt.show()
編輯2
對於scatter()
圖,您必須明確指定(x,y)。 此外,調用df_p['cumu']
將導致Series
,而不是DataFrame
。
要正確顯示散點圖,您需要以下內容:
import numpy as np
import pandas as pd
from collections import Counter
import matplotlib.pyplot as plt
arr = np.random.randint(0, 100, (100000,1))
df = pd.DataFrame(arr)
cnt = Counter(df[0])
df_p = pd.DataFrame(cnt, index=['data']).T
df_p['cumu'] = df_p['data'].cumsum()
df_p.plot(kind='scatter', x='data', y='cumu')
plt.show()
如果效率很重要,你可以使用numpy函數bincount,它需要整數:
import numpy as np
a=np.random.rand(66049).reshape((66049,1)).round(3)
z=np.bincount(np.int32(1000*a[:,0]))
大約需要1毫秒。
問候。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.