我正在尝试为多列数据文件中的一列绘制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
答案 0 :(得分: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
有时你会得到6列:
4211 736 2 4.64968786645 05 2576.0
有时你只得到5:
4814 2464 27 0.000627707861971 117923.0
所以首先要学会如何正确地写数据。
想象一下,所有数据都在名为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列。
我称之为有效数据的是一致的数据,数据总是包含相同数量的列。
您应该使用4814,2464,27,0.000627707861971,,117923.0
或numpy.loadtxt
(如果缺少数据,则使用后者)。请注意,您可以使用numpy.genfromtxt
参数为这两个参数指定分隔符。
delimiter
或者等效地,您可以将data = numpy.loadtxt("valid_input.txt")
col = data[:,2]
参数与usecols
参数一起使用。
对于您的数据,使用unpack
的方法是有效的,如果您在其他地方的第2列之前没有任何其他错误,则只选择第三列(Python语言中的第2列)。
你可以手工完成,这会给我们带来另一种错误:
在那里,您只需使用单个值(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()
没有抱怨。
您一次只能获得一行:您需要将这些值存储在某个位置(例如在列表中),然后对其进行处理。
numpy
无法加载您的数据(它会尝试默认加载所有内容),因为它无法根据行推断您要对6列或5列执行的操作。所以它唯一能做的就是失败。
首先,不要被冒犯:我要说的是帮助你改善。我没有以任何方式判断你,只是向你展示你应该如何应对这种错误,无论是否琐碎。
问题是你似乎只是在没有真正看过它们的情况下复制粘贴错误,所以没有试图理解它们(但我可能错了,我不在你脑海里:))。
但可以肯定的是,你没有将它们复制粘贴到你最喜欢的搜索引擎中,因为答案很多。再说一次,我可能错了。也许你这样做但没有看到这些答案如何适用于你的情况。虽然,谷歌的第一个回答
numpy.loadtxt
很明确。你甚至不必提到这是ValueError: x and y must have same first dimension
或Python。然后你会发现matplotlib
与sorted_data
的长度不同。通过更多的工作,你可以弄清楚我之前说过你的实现。
正如您所见,我没有给出一个规范的回答&#34;因为我认为你没有完成你的工作,所以我不会赢。但你仍然可以这样做:我已经为你提供了回答你自己的问题所需的所有工具。这并不意味着你必须在一个偏远的岛屿上独自完成这一切:我几乎给出了一个完整的答案(真的),文档可以帮助,Google也是如此:)。你所要做的就是搜索一下。一旦你有了工作,编辑你的问题(或回答你自己的问题)。