Python:在numpy数组(大数据集)中计算发生次数的更快方法
我是Python新手。我有一个Python:在numpy数组(大数据集)中计算发生次数的更快方法,python,arrays,performance,numpy,statistics,Python,Arrays,Performance,Numpy,Statistics,我是Python新手。我有一个numpy.array,大小为66049x1(66049行和1列)。这些值从最小到最大排序,属于float类型,其中一些值被重复 我需要确定每个值的出现频率(给定值相等但未超过的次数,例如,X您应该使用np。其中,然后计算得到的索引向量的长度: indices = np.where(x3 <= value) count = len(indices[0]) index=np.其中(x3 对于(100000x1)array,整个脚本只花了很短的时间(~2s)执
numpy.array
,大小为66049x1
(66049行和1列)。这些值从最小到最大排序,属于float
类型,其中一些值被重复
我需要确定每个值的出现频率(给定值相等但未超过的次数,例如,X您应该使用
np。其中
,然后计算得到的索引向量的长度:
indices = np.where(x3 <= value)
count = len(indices[0])
index=np.其中(x3
对于(100000x1)
array,整个脚本只花了很短的时间(~2s)执行。我没有时间,但如果您提供执行您的脚本所需的时间,我们可以进行比较
我用[Counter][2]
从来计算发生的次数,我的经验一直很好(时间方面)。我把它转换成绘图,用T
转换
您的数据确实有点重复,但您可以尝试对其进行进一步的细化。事实上,它非常快
编辑
使用cumsum()创建CDF
编辑2
对于绘图,必须明确指定(x,y)。此外,调用df_p['cumu']
将生成系列,而不是数据帧
要正确显示散点图,您需要以下内容:
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毫秒
尊敬。查看我的编辑,让我知道你是否在寻找。我根本没有使用箱子,我创建了累计总和来表示CDF,但是我发现一个错误,我没有将其标准化。我之前显示的直方图只是概念证明,实际上没有使用它的值。这不是CDF,我上次编辑(编辑2)是为了向您展示如何绘制分散图。您需要将df_p.plot()
更改为plt.scatter(df_p.index,df_p['cumu']/100000)
就像我在聊天中提到的那样。创建一个新问题,因为此帖子只与您原来的帖子相关。这样可以防止在一篇帖子中回答多个问题。
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()
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()
import numpy as np
a=np.random.rand(66049).reshape((66049,1)).round(3)
z=np.bincount(np.int32(1000*a[:,0]))