Быстрые срезы столбцов в PyTables

У меня есть большой набор целых чисел в PyTables (1 миллион строк, 50 000 столбцов):

In [22]: fmat
Out[22]: 
/fmat (CArray(1025461, 54123), shuffle, blosc(5)) ''
  atom := Int32Atom(shape=(), dflt=0)
  maindim := 0
  flavor := 'numpy'
  byteorder := 'little'
  chunkshape := (9, 54123)

Выбор строк является прекрасным:

In [24]: %timeit fmat[0]
10000 loops, best of 3: 46.5 µs per loop

Но выбор столбцов занимает вечность:

In [25]: %timeit fmat[:,0]
1 loop, best of 3: 25 s per loop

Существует ли эффективный способ индексировать столбцы или транспонировать массив, чтобы разрешить быстрые срезы?

1 ответ

  1. Ответ находится в chunkshapeпараметре при создании массива.

    Если нужны только срезы столбцов, просто установите столбец в качестве chunkshape. Например, для матрицы NxP (N строк и P столбцов) выберите:

    fmat = f.create_carray(f.root, 'fmat', tb.Int32Atom(),
    shape=(N, P), filters=filters,
    chunkshape=[N,1])