当 names=True for Python 3 时,Numpy genfromtxt 似乎不起作用
Numpy genfromtxt doesn't seem to work when 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 给了我一个 'running out of memory' 警告。
from numpy import genfromtxt
my_data = genfromtxt('DlRefinedRatings.csv', delimiter=',' , dtype=int, names=True)
print(my_data[0:50])
Python3 中的 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) 整数数组。
用names=True
花了很长时间,然后发出一长串错误,除行号外都一样(即使用max_rows):
Line #4121986 (got 4 columns instead of 3)
header 行很奇怪 - 初始名称为空白:
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)
是最初的错误 header 行,用 -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]])
总之,跳过 header,如果您想要结构化数组,请使用您自己的名称。
我正在使用 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 给了我一个 'running out of memory' 警告。
from numpy import genfromtxt
my_data = genfromtxt('DlRefinedRatings.csv', delimiter=',' , dtype=int, names=True)
print(my_data[0:50])
Python3 中的 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) 整数数组。
用names=True
花了很长时间,然后发出一长串错误,除行号外都一样(即使用max_rows):
Line #4121986 (got 4 columns instead of 3)
header 行很奇怪 - 初始名称为空白:
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)
是最初的错误 header 行,用 -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]])
总之,跳过 header,如果您想要结构化数组,请使用您自己的名称。