在问这个问题之前我已经阅读了这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将包含无法直接绘制的元组 。
解决这个简单问题的方法吗?
答案 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']