使用“genfromtxt”提取列

时间:2013-12-10 23:38:18

标签: python python-2.7 matplotlib pandas tuples

在问这个问题之前我已经阅读了这2个问题( q1 q2 )但我还没有找到任何令人满意的问题答案

我需要从2D数组中提取两列而不使用 pandas loadtxt ,但使用 genfromtxt

目前,我所做的是:

X = np.genfromtxt('File1.csv', 
                    delimiter='\t', 
                    skip_header=0, skip_footer=0, 
                    names=True , usecols=("Time") )

Y = np.genfromtxt('File1.csv', 
                    delimiter='\t', 
                    skip_header=0, skip_footer=0, 
                    names=True , usecols=("Profit") )

然后,使用matplotlib我绘制Y对X,结果是完美的

现在,我在想我应该以“正确”的方式做到这一点并避免读取两次数组。 所以我尝试了解包功能:

 X, Y = np.genfromtxt('File1.csv', 
                    delimiter='\t', 
                    skip_header=0, skip_footer=0, 
                    names=True , usecols=("Time", "Profit"), unpack=True )

我收到消息:要解压的值太多

现在,如果我在没有解包的情况下用输出的一个向量(比如Z)编写上一个命令,则向量Z将包含无法直接绘制的元组

解决这个简单问题的方法吗?

1 个答案:

答案 0 :(得分:3)

如果您有多个指定字段,则会有1-d structured array,如下所示:

>>> np.genfromtxt('File1.csv', delimiter='\t', names=True, usecols=("Time", "Profit"))
array([(0.0, 1.0), (2.0, 3.0), (3.0, 4.0), (5.0, 6.0)], 
      dtype=[('Time', '<f8'), ('Profit', '<f8')])

你无法解压缩1d结构化数组,因为unpack=True所做的就是转置你的数组,使列沿着第一个轴变化,而1d数组的转置本身就是这样。因此,您可以使用unpack获得相同的结果:

>>> np.genfromtxt('File1.csv', delimiter='\t', names=True, usecols=("Time", "Profit"), unpack=True)
array([(0.0, 1.0), (2.0, 3.0), (3.0, 4.0), (5.0, 6.0)], 
      dtype=[('Time', '<f8'), ('Profit', '<f8')])

即使您在usecols参数中使用@Roberto建议的数字,仍然存在问题,因为如果您有多个字段,使用names=True会为您提供结构化数组(这就是为什么您第一次尝试没注意到。)

如果将其另存为Z,则可以将其设为

plt.plot(Z['Time'], Z['Profit'])

或者您可以按照原来的要求拆分它:

X, Y = Z['Time'], Z['Profit']