如何从 .csv 文件中提取数据并绘制图形?

3

我有一个包含24列x514行数据的.csv文件。每一列代表不同的参数,我希望研究不同参数之间的趋势。

我使用genfromtxt将数据导入为numpy数组,以便我可以绘制两个特定列的值(例如第9列与第11列)。以下是我目前拥有的:

import matplotlib.pyplot as plt
import numpy as np


data = np.genfromtxt('output_burnin.csv', delimiter=',')

impactparameter=data[:,11]
planetradius=data[:,9]

plt.plot(planetradius,impactparameter,'bo')

plt.title('Impact Parameter vs. Planet Radius')
plt.xlabel('R$_P$/R$_Jup$')
plt.ylabel('b/R$_star$')

plt.show()

使用这段代码时,我在第12行遇到了一个错误:

    impactparameter=data[:,11]
IndexError: too many indices

这里可能存在什么问题呢?

另外,我一直在试图弄清楚如何给.csv文件中的每一列添加标题。这样,我就可以在绘图时直接调用该列的名称,而不是计算列号。有办法实现吗?

我是Python的完全新手,任何帮助将不胜感激,谢谢!


1
看看 csv 模块。https://docs.python.org/2/library/csv.html impactparameter 是一个大小为1的数组,很可能它不知道如何处理 [:,11]。因此,文件读取出了问题,也就是说你得到了与你所假设的不同的数据集。 - Aleksander Lidtke
“print data” 很可能会回答你的问题。 - JulienD
看起来 data 不是一个二维数组。检查一下 data.shape 看看它的形状是怎样的。根据你的 CSV 文件格式,你可能需要使用 data.reshape 将它转换成正确的形状以便像你想要的那样对它进行切片。 - hunse
我使用了 data.shape 来检查数据的大小是 [514,]。这是因为列之间使用空格而不是逗号分隔。我使用了 split() 函数来分离每一列,现在它已经正常工作了。谢谢大家! - Kristine
1个回答

0
另外,我一直在尝试弄清楚如何在 .csv 文件中为每一列添加标题。因此,我可以在绘图时直接调用特定列的名称,而不是计算列号。有什么方法可以做到这一点吗?
要为数组中的列命名,您需要将其转换为结构化数组。
以下是一个简单的示例:
a = np.zeros(5, dtype='f4, f4, f4')
a.dtype.names = ('col1', 'col2', 'col3')
print a[0]  # prints [0, 0, 0], the first row (record)
print a['col1']  # prints [0, 0, 0, 0, 0], the first column

如果你在 CSV 文件的开头有列名,并且在 `np.genfromtxt` 中设置了 `names=True`,那么 Numpy 将自动为你创建一个带有正确名称的结构化数组。

谢谢!这个可行!不过为了定义数据类型,关键字应该写成 dtype=('f4,f4,f4') - Kristine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接