使用 genfromtxt 和第一列字符串读取 csv 的 Numpy IndexError
Numpy IndexError reading csv with genfromtxt and first column string
我有一些代码可以读取制表符分隔值 (tsv) 的文件,当第一列是数字时工作正常,但当它是字符串时失败。
import os
import numpy as np
input_file = os.path.normpath('C:/Users/sturaroa/Documents/PycharmProjects/my_file.tsv')
# read values from file, by column
my_data = np.genfromtxt(input_file, delimiter='\t', skip_header=0)
print('my_data\n' + str(my_data))
groups = my_data[:, 0] # 1st column
X = my_data[:, 1] # 2nd column
Y = my_data[:, 2] # 3rd column
errors = my_data[:, 3] # 4th column (errors)
print('\ngroups ' + str(groups) + '\nX ' + str(X) + '\nY ' + str(Y) + '\nerrors ' + str(errors))
这是文件内容(制表符分隔)
2.4 2 4.0 0.0
2.4 4 8.210526 0.7254761
2.9 4 8.4 0.8081221
2.9 6 12.52 1.0544369
程序打印这个
my_data
[[ 2.4 2. 4. 0. ]
[ 2.4 4. 8.210526 0.7254761]
[ 2.9 4. 8.4 0.8081221]
[ 2.9 6. 12.52 1.0544369]]
groups [ 2.4 2.4 2.9 2.9]
X [ 2. 4. 4. 6.]
Y [ 4. 8.210526 8.4 12.52 ]
errors [ 0. 0.7254761 0.8081221 1.0544369]
我看到 this question 建议使用 dtype=None
。但是,如果我这样做,我会收到此错误
Traceback (most recent call last):
File "C:/Users/sturaroa/Documents/PycharmProjects/2d_plot_test.py", line 11, in <module>
groups = my_data[:, 0] # 1st column
IndexError: too many indices for array
我需要调整我的代码以处理这样的输入
something 2 4.0 0.0
something 4 8.210526 0.7254761
some_other_thing 8.4 0.8081221
some_other_thing 12.52 1.0544369
第一列是可变长度的字符串,其他列是数字(整数或浮点数)。
我在 Python 2.7.
上使用 numpy 1.9.2
我无法找到您问题的索引
您要调整代码的输入的列数似乎不均匀。您可以调整列数或使用类似 genfromtext
的东西来代替 np.asmatrix
来维护矩阵结构,无论输入数据中有多少列。这给了我 -
In [1827]: paste
my_data = np.asmatrix([line.split() for line in open('input2.txt')])
print('my_data\n' + str(my_data))
groups = my_data[:, 0] # 1st column
X = my_data[:, 1] # 2nd column
Y = my_data[:, 2] # 3rd column
errors = my_data[:, 3] # 4th column (errors)
print('\ngroups ' + str(groups) + '\nX ' + str(X) + '\nY ' + str(Y) + '\nerrors ' + str(errors))
## -- End pasted text --
my_data
[[['something', '2', '4.0', '0.0']
['something', '4', '8.210526', '0.7254761']
['some_other_thing', '8.4', '0.8081221']
['some_other_thing', '12.52', '1.0544369']]]
groups [[['something', '2', '4.0', '0.0']]]
X [[['something', '4', '8.210526', '0.7254761']]]
Y [[['some_other_thing', '8.4', '0.8081221']]]
errors [[['some_other_thing', '12.52', '1.0544369']]]
当您使用 dtype=None
阅读并且有字符串列时,genfromtxt
会为您提供一个结构化数组。打印 my_data
,并查看其形状和数据类型(并将其添加到您的问题中)。
您按名称而不是索引访问此类数组的列。由于您不使用 header 或给出名称,因此将使用 my_data['f0']
.
访问第一列
您可能需要查看有关结构化数组的 numpy 文档。
我有一些代码可以读取制表符分隔值 (tsv) 的文件,当第一列是数字时工作正常,但当它是字符串时失败。
import os
import numpy as np
input_file = os.path.normpath('C:/Users/sturaroa/Documents/PycharmProjects/my_file.tsv')
# read values from file, by column
my_data = np.genfromtxt(input_file, delimiter='\t', skip_header=0)
print('my_data\n' + str(my_data))
groups = my_data[:, 0] # 1st column
X = my_data[:, 1] # 2nd column
Y = my_data[:, 2] # 3rd column
errors = my_data[:, 3] # 4th column (errors)
print('\ngroups ' + str(groups) + '\nX ' + str(X) + '\nY ' + str(Y) + '\nerrors ' + str(errors))
这是文件内容(制表符分隔)
2.4 2 4.0 0.0
2.4 4 8.210526 0.7254761
2.9 4 8.4 0.8081221
2.9 6 12.52 1.0544369
程序打印这个
my_data
[[ 2.4 2. 4. 0. ]
[ 2.4 4. 8.210526 0.7254761]
[ 2.9 4. 8.4 0.8081221]
[ 2.9 6. 12.52 1.0544369]]
groups [ 2.4 2.4 2.9 2.9]
X [ 2. 4. 4. 6.]
Y [ 4. 8.210526 8.4 12.52 ]
errors [ 0. 0.7254761 0.8081221 1.0544369]
我看到 this question 建议使用 dtype=None
。但是,如果我这样做,我会收到此错误
Traceback (most recent call last):
File "C:/Users/sturaroa/Documents/PycharmProjects/2d_plot_test.py", line 11, in <module>
groups = my_data[:, 0] # 1st column
IndexError: too many indices for array
我需要调整我的代码以处理这样的输入
something 2 4.0 0.0
something 4 8.210526 0.7254761
some_other_thing 8.4 0.8081221
some_other_thing 12.52 1.0544369
第一列是可变长度的字符串,其他列是数字(整数或浮点数)。
我在 Python 2.7.
上使用 numpy 1.9.2我无法找到您问题的索引
您要调整代码的输入的列数似乎不均匀。您可以调整列数或使用类似 genfromtext
的东西来代替 np.asmatrix
来维护矩阵结构,无论输入数据中有多少列。这给了我 -
In [1827]: paste
my_data = np.asmatrix([line.split() for line in open('input2.txt')])
print('my_data\n' + str(my_data))
groups = my_data[:, 0] # 1st column
X = my_data[:, 1] # 2nd column
Y = my_data[:, 2] # 3rd column
errors = my_data[:, 3] # 4th column (errors)
print('\ngroups ' + str(groups) + '\nX ' + str(X) + '\nY ' + str(Y) + '\nerrors ' + str(errors))
## -- End pasted text --
my_data
[[['something', '2', '4.0', '0.0']
['something', '4', '8.210526', '0.7254761']
['some_other_thing', '8.4', '0.8081221']
['some_other_thing', '12.52', '1.0544369']]]
groups [[['something', '2', '4.0', '0.0']]]
X [[['something', '4', '8.210526', '0.7254761']]]
Y [[['some_other_thing', '8.4', '0.8081221']]]
errors [[['some_other_thing', '12.52', '1.0544369']]]
当您使用 dtype=None
阅读并且有字符串列时,genfromtxt
会为您提供一个结构化数组。打印 my_data
,并查看其形状和数据类型(并将其添加到您的问题中)。
您按名称而不是索引访问此类数组的列。由于您不使用 header 或给出名称,因此将使用 my_data['f0']
.
您可能需要查看有关结构化数组的 numpy 文档。