python-使用“ genfromtxt”提取列

在问这个问题(q1q2)之前,我已经阅读了这两个问题,但我没有找到满意的答案

我需要从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-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')])

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

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

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

或者您可以按照最初的要求将其拆分:

X, Y = Z['Time'], Z['Profit']
上一篇:Sum of gcd of Tuples (Hard)


下一篇:python-列表中从文件到元组的字符串