np.loadtxt与np.genfromtxt

时间:2018-06-28 06:51:11

标签: python-3.x numpy genfromtxt

当我使用以下np.loadtxt代码加载格式的数据时:

2017-07-26,153.3500,153.9300,153.0600,153.5000,153.5000,12778195.00

数据加载正常,请输入loadtxt代码->

a, b, c, d, e, f, g = np.loadtxt("goog.csv",
                                  dtype={'names': ("b'Date", 'Open', 'High', 'Low', 'Close', 'Adjusted_close', 'Volume'),
                                        'formats': ('U10', np.float, np.float, np.float, np.float, np.float, np.float)},                               
                                  delimiter=',',
                                  skiprows=1,
                                  unpack=True)
print(a)

Output->

['2017-07-26' '2017-07-25' '2017-07-24' ..., '2000-01-05' '2000-01-04'
'2000-01-03']

Process finished with exit code 0

但是使用相应的np.genfromtxt代码后会出现ValueError:太多的值无法解包,我使用了以下genfromtxt代码->

a, b, c, d, e, f, g = np.genfromtxt('goog.csv',  
                                    dtype={'names': ("b'Date", 'Open', 'High', 'Low', 'Close', 'Adjusted_close', 'Volume'),
                                           'formats': ('U10', np.float, np.float, np.float, np.float, np.float, np.float)},
                                    delimiter=',',
                                    skip_header=1,
                                    unpack=True)
print(a)

Output->

Traceback (most recent call last):
File "C:/Users/sonika jha/PycharmProjects/csvCheck/csvCheck.py", line 84, in <module>
download_stock_data()
File "C:/Users/sonika jha/PycharmProjects/csvCheck/csvCheck.py", line 66, in download_stock_data
unpack=True)
ValueError: too many values to unpack (expected 7)

Process finished with exit code 1

我的最终目标是使用genfromtxt将日期加载为字符串数据类型,将其余数据加载为float。

1 个答案:

答案 0 :(得分:1)

loadtxtgenfromtxt处理结构化数据的解压缩方式不同

loadtxt文档:

  

解压:布尔型,可选

     

如果为True,则对返回的数组进行转置,以使参数可以为       使用x, y, z = loadtxt(...)打开包装。当用于结构化       数据类型,则为每个字段返回数组。默认值为False。

genfromtxt文档:

  

解压:布尔型,可选

     

如果为True,则对返回的数组进行转置,以使参数可以为       使用x, y, z = loadtxt(...)

打开包装

最后引号中的loadtxt是错字。

如果我将样本行重复3次,然后运行genfromtxt(使用unpack=False):

我得到一个(3,)数组,其中包含定义的dtype

In [327]: data
Out[327]: 
array([('2017-07-26', 153.35, 153.93, 153.06, 153.5, 153.5, 12778195.),
       ('2017-07-26', 153.35, 153.93, 153.06, 153.5, 153.5, 12778195.),
       ('2017-07-26', 153.35, 153.93, 153.06, 153.5, 153.5, 12778195.)],
      dtype=[('bDate', '<U10'), ('Open', '<f8'), ('High', '<f8'), ('Low', '<f8'), ('Close', '<f8'), ('Adjusted_close', '<f8'), ('Volume', '<f8')])

loadtxt产生相同的结果

但是loadtxtunpack最终会完成

a = data['bDate`]
b = data['Open']
etc.

也就是说,为每个变量分配一个字段。

但是genfromtxt确实

a = data[0]
b = data[1]
etc

也就是每个变量的1d数组的一行或元素。元素比您的7个变量多,它抱怨要解包的值太多。

因此要么坚持使用loadtxt,要么不要将unpackgenfromtxt一起使用。

我认为在不进行unpack的情况下加载结构化数组将为您进行进一步处理提供更多选择。