Numpy genfromtxt 在 names=True for Python 3 时似乎不起作用



我正在使用Google Colab环境。

我正在使用的文件可以在这里找到。它是一个csv文件

https://drive.google.com/open?id=1v7Mm6S8BVtou1iIfobY43LRF8MgGdjfU

警告:它有几百万行。

此代码在 Google Colab Python 3 笔记本中运行一分钟内。我试了几次都没有问题。

from numpy import genfromtxt
my_data = genfromtxt('DlRefinedRatings.csv', delimiter=',' ,  dtype=int)
print(my_data[0:50])

另一方面,下面的代码在与Google Colab的服务器断开连接之前运行了几分钟。我尝试了多次。最终,colab给了我一个"内存耗尽"的警告。

from numpy import genfromtxt
my_data = genfromtxt('DlRefinedRatings.csv', delimiter=',' ,  dtype=int,  names=True)
print(my_data[0:50])

似乎曾经在 Python 3 中存在 names=True 的问题,但该问题已修复 https://github.com/numpy/numpy/issues/5411

我检查了我在 Colab 中使用的版本,它是最新的

import numpy as np
print(np.version.version)
>1.14.3

my_data = genfromtxt('DlRefinedRatings.csv', delimiter=',' ,  dtype=int, max_rows=100)

我得到了一个 (100,4( int 数组。

使用names=True花了很长时间,然后发布了一长串错误,除了行号(即使有max_rows

(:
Line #4121986 (got 4 columns instead of 3)

标题行很糟糕 - 带有初始空白名称:

In [753]: !head ../Downloads/refinedRatings.csv
,user_id,book_id,rating
0,1,258,5
1,2,4081,4
2,2,260,5
3,2,9296,5
5,2,26,4
7,2,33,4
8,2,301,5
9,2,2686,5
10,2,3753,5

所以根据名称,它认为有 3 列,但所有数据行都有 4 列。 因此错误。 我不知道为什么在这种情况下它忽略了max_rows

但有我自己的名字

In [755]: np.genfromtxt('../Downloads/refinedRatings.csv',delimiter=',',dtype=in
...: t, max_rows=10, names='foo,bar,dat,me')
Out[755]: 
array([(-1, -1,   -1, -1), ( 0,  1,  258,  5), ( 1,  2, 4081,  4),
( 2,  2,  260,  5), ( 3,  2, 9296,  5), ( 5,  2,   26,  4),
( 7,  2,   33,  4), ( 8,  2,  301,  5), ( 9,  2, 2686,  5),
(10,  2, 3753,  5)],
dtype=[('foo', '<i8'), ('bar', '<i8'), ('dat', '<i8'), ('me', '<i8')])

(-1,-1,-1,-1)的第一个记录是初始错误的标题行,用 -1 代替字符串,它不能变成整数。 因此,我们应该按如下方式skip_header

或者:

In [756]: np.genfromtxt('../Downloads/refinedRatings.csv',delimiter=',',dtype=in
...: t, max_rows=10, skip_header=1)
Out[756]: 
array([[   0,    1,  258,    5],
[   1,    2, 4081,    4],
[   2,    2,  260,    5],
[   3,    2, 9296,    5],
[   5,    2,   26,    4],
[   7,    2,   33,    4],
[   8,    2,  301,    5],
[   9,    2, 2686,    5],
[  10,    2, 3753,    5],
[  11,    2, 8519,    5]])

总之,跳过标题,如果你想要一个结构化数组,请使用你自己的名称。

相关内容

  • 没有找到相关文章

最新更新