2011-12-27 4 views
7

Как создать массив огромных numpy с использованием pytables. Я попробовал это, но дал мне «ValueError: массив слишком большой». Ошибка:Создание огромного массива numpy с использованием pytables

import numpy as np 
import tables as tb 
ndim = 60000 
h5file = tb.openFile('test.h5', mode='w', title="Test Array") 
root = h5file.root 
h5file.createArray(root, "test", np.zeros((ndim,ndim), dtype=float)) 
h5file.close() 

ответ

8

Вы можете попробовать использовать класс tables.CArray, как он поддерживает сжатие, но ...

Я думаю, что вопросы больше о NumPy чем pytables, потому что вы создаете массив, используя NumPy перед сохранением его pytables.

Таким образом вам нужно много памяти для выполнения np.zeros ((ndim, ndim) - и это, вероятно, является местом, где исключение:. «ValueError: массив слишком велик» поднят

Если матрица/массив не плотно, то вы могли бы использовать разреженное представление матриц доступны в SciPy: http://docs.scipy.org/doc/scipy/reference/sparse.html

Другим решением является, чтобы попытаться получить доступ к массиву если он вам не нужен весь массив сразу через куски - проверить эта резьба: Very large matrices using Python and NumPy

14

Piggybacking off of @ b1r3k, чтобы создать массив, к которому вы не будете иметь доступ сразу (т. е. принесите все это в память), вы хотите использовать CArray (Chunked Array). Идея заключается в том, что вы затем должны заполнить и получить доступ к ней поэтапно:

import numpy as np 
import tables as tb 
ndim = 60000 
h5file = tb.openFile('test.h5', mode='w', title="Test Array") 
root = h5file.root 
x = h5file.createCArray(root,'x',tb.Float64Atom(),shape=(ndim,ndim)) 
x[:100,:100] = np.random.random(size=(100,100)) # Now put in some data 
h5file.close() 
Смежные вопросы