使用“genfromtxt”提取列

3
我在提问之前已经阅读了这两个问题(q1q2),但我没有找到令人满意的答案。
我需要使用genfromtxt从二维数组中提取两列,但不能使用pandasloadtxt
目前,我的做法是:
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 )

我收到了信息:"too many values to unpack"

如果我使用一个向量(例如Z)并且不进行解包,那么向量Z会包含一个无法直接绘制的元组。

有没有解决这个看似简单的问题的方法?


你尝试在 usecols 中使用列号了吗? - Roberto
我已经这样做了,但我更愿意使用标题中的名称,因为这些列的位置在文件之间会发生变化。 - SAAD
抱歉,我的意思是,如果您在usecols中使用数字,是否会遇到问题? - Roberto
我现在尝试了一下,仍然显示相同的错误信息。 - SAAD
您无法解包结构化数组。 - askewchan
1个回答

3
当您拥有多个命名字段时,将会有一个1维结构化数组,如下所示:(参考链接)
>>> 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')])

由于unpack=True只是将您的数组转置以使列沿第一轴变化,因此您无法解压缩1d结构化数组。而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')])

即使您像@Roberto建议的那样在usecols参数中使用数字,您仍然会遇到问题,因为如果您有多个字段,则使用names=True会给您提供一个结构化数组(这就是您在第一次尝试中没有注意到它的原因)。
如果您将其保存为Z,则可以像下面这样绘制它:
plt.plot(Z['Time'], Z['Profit'])

或者你可以按照你最初的要求将它分开:
X, Y = Z['Time'], Z['Profit']

2
细节、卫道、语义方面的小问题:一般而言,结构化数组可以是n维的,因此说“一个结构化数组实际上是1d”可能有点误导。由genfromtxt返回的结构化数组是1-d的。 - Warren Weckesser
感谢@Warren,已澄清。 - askewchan

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