gpt4 book ai didi

Python:计算 numpy 数组(大数据集)中出现次数的更快方法

转载 作者:行者123 更新时间:2023-11-30 23:05:52 33 4
gpt4 key购买 nike

我是 Python 新手。我有一个 numpy.array ,其大小为 66049x1 (66049 行和 1 列)。这些值按从小到大的顺序排序,并且为浮点型,其中一些值是重复的。

我需要确定每个值出现的频率(给定值等于但未超过的次数,例如统计术语中的X<=x ),以便稍后绘制样本累积分布函数。

我当前使用的代码如下,但速度非常慢,因为它必须循环 66049x66049=4362470401 次。有什么方法可以提高这段代码的速度吗?使用字典也许会有帮助吗?不幸的是,我无法更改正在使用的数组的大小。

+++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+++

最佳答案

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()

整个脚本的执行时间很短(~2s)(100,000x1)数组)。我没有时间,但如果您提供执行您的脚本所需的时间,我们可以进行比较。

enter image description here

我用过[Counter][2]来自 collections 计算发生的次数,我的经历一直很棒(从时间上来说)。我把它转换成 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()

enter image description here

编辑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()

enter image description here

关于Python:计算 numpy 数组(大数据集)中出现次数的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32990282/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com