在问这个问题(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-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']