【发布时间】:2015-05-30 23:54:32
【问题描述】:
我正在阅读制表符分隔的文件。我想自动推断列的类型,然后读取第一列的所有成员。
但是,numpy 输出的类型可能会有很大差异,具体取决于输入(单列或多列)和使用的 dtype 参数。
这是一组测试用例
multi_col = "a\t1\t2\nb\t3\t4"
a = np.genfromtxt(StringIO(multi_col), delimiter="\t", skip_header=0,
dtype=[('f0', '|S16'), ('f1', '<i8'), ('f2', '<i8')])
print_properties(a, 'a')
print("first col a['f0'] = " + str(a['f0']) + '\n')
a = np.genfromtxt(StringIO(multi_col), delimiter="\t", skip_header=0, dtype=None)
print_properties(a, 'a')
print("first col a['f0'] = " + str(a['f0']) + '\n')
a = np.genfromtxt(StringIO(multi_col), delimiter="\t", skip_header=0, dtype=str)
print_properties(a, 'a')
print('first col a[:, 0] = ' + str(a[:, 0]) + '\n')
single_col = "a\nb"
b = np.genfromtxt(StringIO(single_col), delimiter="\t", skip_header=0, dtype=[('f0', '|S16')])
print_properties(b, 'b')
print("first col b['f0'] = " + str(b['f0']) + '\n')
b = np.genfromtxt(StringIO(single_col), delimiter="\t", skip_header=0, dtype=None)
print_properties(b, 'b')
print('already a column\n')
b = np.genfromtxt(StringIO(single_col), delimiter="\t", skip_header=0, dtype=str)
print_properties(b, 'b')
print('already a column\n')
single_val = "a\n"
c = np.genfromtxt(StringIO(single_val), delimiter="\t", skip_header=0, dtype=str)
print_properties(c, 'c')
print('single value\n')
我找不到以统一方式访问第一列的方法。不同的情况需要不同的运算符。
如果我在前两种情况下使用col0 = a[:, 0],我会收到此错误
IndexError: too many indices for array
另一方面,如果我使用col0 = a['f0'],则在第三种情况下会出错
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
是否有一种统一的方式来访问第一列而不进行类型转换?
【问题讨论】:
-
对于每种情况,打印
dtype和shape。如果dtype具有像f0这样的字段名称,则使用它来索引“列”。如果是二维数组,请使用数字来索引列。如果这些术语令人困惑,请阅读dtype和structured arrays上的文档。 -
令人困惑的部分是,如果有多个列,则会分配默认名称
f0, f1, ...,但如果文件中只有一列,则不会分配默认名称f0。这让事情有点不方便。 -
numpy尝试创建具有统一元素的多维数组。如果做不到这一点,genfromtxt会走结构化数组路线。这种可变性是使用方便的dtype=None参数的代价。 -
好的,我找到了部分解决方法,但是我仍然需要区分 numpy 何时输出统一的二维数组和何时输出一维数组。有什么想法吗?
-
如果
arr.ndim>1使用数字索引。或者是dtype.fields is None。