【问题标题】:Numpy accessing column of genfromtxt array raises IndexErrorgenfromtxt 数组的 Numpy 访问列引发 IndexError
【发布时间】: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

是否有一种统一的方式来访问第一列而不进行类型转换?

【问题讨论】:

  • 对于每种情况,打印dtypeshape。如果dtype 具有像f0 这样的字段名称,则使用它来索引“列”。如果是二维数组,请使用数字来索引列。如果这些术语令人困惑,请阅读 dtypestructured arrays 上的文档。
  • 令人困惑的部分是,如果有多个列,则会分配默认名称 f0, f1, ...,但如果文件中只有一列,则不会分配默认名称 f0。这让事情有点不方便。
  • numpy 尝试创建具有统一元素的多维数组。如果做不到这一点,genfromtxt 会走结构化数组路线。这种可变性是使用方便的dtype=None 参数的代价。
  • 好的,我找到了部分解决方法,但是我仍然需要区分 numpy 何时输出统一的二维数组和何时输出一维数组。有什么想法吗?
  • 如果arr.ndim&gt;1 使用数字索引。或者是dtype.fields is None

标签: python arrays csv numpy


【解决方案1】:

这是“对我有用”的解决方案。

def print_1st_col(arr):
    # access the first column according to the different structures numpy can output
    if arr.dtype.fields is not None:
        print('structured array')
        col = arr['f0']  # structured array
    else:
        if arr.ndim <= 1:
            print('uniform 1D array')
            col = arr  # direct access (single number or uniform 1D array)
        else:
            print('uniform multi-dimensional array')
            col = arr[:, 0]  # uniform multi-dimensional array

    print(str(col) + '\n')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2012-05-10
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多