【问题标题】:How to plot in CCDF with a list?如何使用列表在 CCDF 中绘图?
【发布时间】:2014-12-10 21:09:18
【问题描述】:

当数据在一列时,我可以很好地绘制 CDF 和 CCDF。但是当数据采用以下给定格式时,我对如何绘制 CDF 或 CCDF 有点无能为力。圆括号() 中的对是节点对。方括号[] 中的值是出现值和介于两者之间的数字例如:7 是频率。我们不考虑频率,只考虑出现值。

输入数据格式,它们是数百万行,方括号之间有很多值([])。

('4503', '656') 7 [2473.0, 35.0, 235.0, 157.0, 505.0, 45.0, 1303.0] 
('2105', '674') 1 [2584.0] 
('5139', '1086') 1 [1488.0] 
('3690', '2034') 6 [1009.0, 1108.0, 132.0, 447.0, 157.0, 466.0] 
('3867', '1982') 1 [1134.0] 

我必须将方括号 ([]) 之间的数据的 CCDF 绘制在一起,而不是单独绘制。我不明白如何读取方括号之间的数据并绘制它。

【问题讨论】:

  • 您能否详细说明每个数字的含义?

标签: python arrays list numpy matplotlib


【解决方案1】:

您只需找到[] 的索引,逐行切出数据并使用ast.literal_eval 将其解析为列表并将其附加到主列表中即可。

import ast
import numpy as np
from pylab import *

file_data = """('4503', '656') 7 [2473.0, 35.0, 235.0, 157.0, 505.0, 45.0, 1303.0] 
('2105', '674') 1 [2584.0] 
('5139', '1086') 1 [1488.0] 
('3690', '2034') 6 [1009.0, 1108.0, 132.0, 447.0, 157.0, 466.0] 
('3867', '1982') 1 [1134.0] """

data = []

for line in file_data.splitlines():
    data += ast.literal_eval(line[line.find('['):line.find(']')+1])

完成上述操作后,您应该能够按如下方式绘制 CDF:

# Building an array of uniform x points ranging from 0 to the max(data)
X  = np.arange(0,max(data), max(data) / len(Y))

# Convert data to a numpy array
Y  = np.array(sorted(data))

# Normalizing data to yield a proper PDF vector
Y /= Y.sum()

# CDF can be obtained by the `np.cumsum` method:
Yc = np.cumsum(Y)

# Plot Y vs X
plot(X,Y,color="green" )

# Plot the CDF
plot(X,Yc,color="red"   )

# Display the plot
show()

以上数据得到如下:

【讨论】:

  • 这看起来应该可以。我有点困惑,但我会用完整的数据检查并回复。谢谢!!
  • 我更改了这个file_data = np.loadtxt('Input_File') 但我收到了这个错误Traceback (most recent call last): File "new_line.py", line 5, in <module> file_data = np.loadtxt('Input_File') File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 796, in loadtxt items = [conv(val) for (conv, val) in zip(converters, vals)] ValueError: could not convert string to float: ('785',
  • 将整个数据文件加载为file_data 变量中的字符串。使用f = open('Input_File'); file_data = f.read(); f.close() 并按照上述说明进行操作!看看有没有帮助...
【解决方案2】:

你的问题主要是把输入数据放到正确的格式上:

  1. 步骤:为您需要的数据解析输入文件,即方括号之间的值:这可以通过使用 python 标准库中的 re 模块的正则表达式轻松完成。将它们全部用空格分隔到一个文本文件中。

  2. 步骤:将所有这些值分配给一个快速的 numpy 数组并按照此处描述的方式绘制它们:Read file and plot CDF in Python

【讨论】:

  • 如果我使用re 模块来解析输入,圆括号中的对和方括号中的对会混合在一起,识别什么是什么真的很混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 2020-11-10
  • 1970-01-01
  • 2011-10-04
相关资源
最近更新 更多