CDF累积分布函数错误

时间:2014-09-11 15:36:18

标签: python file numpy matplotlib plot

我正在尝试为多列数据文件中的一列绘制CDF。当数据文件中只有一列时,它会很好地绘制。当我尝试从数据中获取特定列时,它会给我错误。我也尝试使用for循环来读取它读得很好的特定列。如果我将for plot语句从for循环中给出,则只显示该列的最后一个值,如果我将plot语句保留在循环内,则会给出错误。这不是读取文件或特定列的问题,甚至不是缩进问题。我该如何解决?

for for循环

import numpy as np
import matplotlib.pyplot as plt
from pylab import*
import math
from matplotlib.ticker import LogLocator

with open('input.txt', 'r') as f:
    for rows in f:
        cols = rows.split()
        data = cols[2]
        sorted_data = np.sort(data)
        cdf = np.arange(len(data))/float(len(data))
        plt.plot(sorted_data, cdf, '-bs')

plt.show()
#print data

错误

Traceback (most recent call last):
  File "cdf_plot.py", line 13, in <module>
    plt.plot(sorted_data, cdf, '-bs')
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2467, in plot
    ret = ax.plot(*args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 3893, in plot
    for line in self._get_lines(*args, **kwargs):
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 322, in _grab_next_args
    for seg in self._plot_args(remaining, kwargs):
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 300, in _plot_args
    x, y = self._xy_from_xy(x, y)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 240, in _xy_from_xy
    raise ValueError("x and y must have same first dimension")
ValueError: x and y must have same first dimension

代码没有for循环:

import numpy as np
import matplotlib.pyplot as plt
from pylab import*
import math
from matplotlib.ticker import LogLocator

data = np.loadtxt('input.txt')
data_one = [row[2] for row in data]
sorted_data = np.sort(data)
cdf = np.arange(len(data_one))/float(len(data_one))
#cumulative = np.cumsum(data)
#ccdf = 1 - cdf

#plt.plot(data, sorted_data, 'r-*')
plt.plot(sorted_data, cdf, '-bs')

#plt.xlim([0,0.5])
plt.gca().set_xscale("log")
plt.gca().set_yscale("log")
plt.show()

错误:

Traceback (most recent call last):
  File "cum_graph.py", line 7, in <module>
    data = np.loadtxt('e_p_USC_30_days.txt')
  File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 804, in loadtxt
    X = np.array(X, dtype)
ValueError: setting an array element with a sequence.

输入文件:我有兴趣计算col [2]的CDF,即仅第3列

4814  2464  27  0.000627707861971  117923.0
4211  736  2  4.64968786645  05  2576.0
2075  1339  30  0.000697453179968  499822.0
2441  2381  3  6.97453179968  05  1968.0
4694  1738  1  2.32484393323  05  5702.0
4406  3008  12  0.000278981271987  8483.0
3622  1396  3  6.97453179968  05  2564.0
5425  478  1  2.32484393323  05  428.0
4489  1715  6  0.000139490635994  19045.0
3695  3387  2  4.64968786645  05  16195.0

1 个答案:

答案 0 :(得分:3)

这里有很多错误。

1 - 您的数据存在问题

仔细看看他们:

4814  2464  27  0.000627707861971  117923.0
4211  736  2  4.64968786645  05  2576.0
2075  1339  30  0.000697453179968  499822.0
2441  2381  3  6.97453179968  05  1968.0
4694  1738  1  2.32484393323  05  5702.0
4406  3008  12  0.000278981271987  8483.0
3622  1396  3  6.97453179968  05  2564.0
5425  478  1  2.32484393323  05  428.0
4489  1715  6  0.000139490635994  19045.0
3695  3387  2  4.64968786645  05  16195.0

有时你会得到6列:

4211  736  2  4.64968786645  05  2576.0

有时你只得到5:

4814  2464  27  0.000627707861971  117923.0

所以首先要学会如何正确地写数据。

2 - 正确写入数据

想象一下,所有数据都在名为data的2D numpy数组中。

你可以打电话:

numpy.savetxt("input.txt", data)

或者,为了更好地控制格式化:

numpy.savetxt("input.txt", data, fmt="%d %d %d %.6f %d %.1f")

fmt=参数是一种告诉numpy如何保存数据的方法(%d表示将其写为整数,%f表示将其写为float,{{ 1}}表示将其写为只有5位小数的浮点数。)

如果您想自己编写,可以执行以下操作:

%.5f

如果您真正想要写的是5列而不是6列的行,那么请使用另一个分隔符,如fmt = "%d %d %d %.6f %d %.1f" with open("input.txt", "w") as f: for row in data: f.write(fmt%row+"\n") 。这样,

,

显然包含6列。

3 - 加载有效数据

我称之为有效数据的是一致的数据,数据总是包含相同数量的列。

您应该使用4814,2464,27,0.000627707861971,,117923.0 numpy.loadtxt(如果缺少数据,则使用后者)。请注意,您可以使用numpy.genfromtxt参数为这两个参数指定分隔符。

delimiter

或者等效地,您可以将data = numpy.loadtxt("valid_input.txt") col = data[:,2] 参数与usecols参数一起使用。

4 - 加载无效数据

对于您的数据,使用unpack的方法是有效的,如果您在其他地方的第2列之前没有任何其他错误,则只选择第三列(Python语言中的第2列)。

你可以手工完成,这会给我们带来另一种错误:

5 - 首次实施的问题

在那里,您只需使用单个值(usecols中的值)替换变量数据:

cols[2]

您尝试对单个值进行排序:

with open('input.txt', 'r') as f:
    for rows in f:
        cols = rows.split()
        data = cols[2]

你想获得单个值的长度:

        sorted_data = np.sort(data)

我真的很惊讶 cdf = np.arange(len(data))/float(len(data)) plt.plot(sorted_data, cdf, '-bs') plt.show() 没有抱怨。

您一次只能获得一行:您需要将这些值存储在某个位置(例如在列表中),然后对其进行处理。

6 - 第二次实施的问题

numpy无法加载您的数据(它会尝试默认加载所有内容),因为它无法根据行推断您要对6列或5列执行的操作。所以它唯一能做的就是失败。

7 - 你的问题

首先,不要被冒犯:我要说的是帮助你改善。我没有以任何方式判断你,只是向你展示你应该如何应对这种错误,无论是否琐碎。

  1. 阅读错误。
  2. 试着了解发生了什么。
  3. 在互联网上查找这些错误。
  4. 问别人。
  5. 问题是你似乎只是在没有真正看过它们的情况下复制粘贴错误,所以没有试图理解它们(但我可能错了,我不在你脑海里:))。

    但可以肯定的是,你没有将它们复制粘贴到你最喜欢的搜索引擎中,因为答案很多。再说一次,我可能错了。也许你这样做但没有看到这些答案如何适用于你的情况。虽然,谷歌的第一个回答

    numpy.loadtxt

    很明确。你甚至不必提到这是ValueError: x and y must have same first dimension 或Python。然后你会发现matplotlibsorted_data的长度不同。通过更多的工作,你可以弄清楚我之前说过你的实现。

    8 - 证明我错了

    正如您所见,我没有给出一个规范的回答&#34;因为我认为你没有完成你的工作,所以我不会赢。但你仍然可以这样做:我已经为你提供了回答你自己的问题所需的所有工具。这并不意味着你必须在一个偏远的岛屿上独自完成这一切:我几乎给出了一个完整的答案(真的),文档可以帮助,Google也是如此:)。你所要做的就是搜索一下。一旦你有了工作,编辑你的问题(或回答你自己的问题)。