Подтвердить что ты не робот

Как я могу создать нужный файл .npy на диске?

Возможно ли создать файл .npy без выделения соответствующего массива в памяти?

Мне нужно создать и работать с большим массивом numpy, слишком большим для создания в памяти. Numpy поддерживает сопоставление памяти, но насколько я могу видеть, мои параметры:

  • Создайте memmapped файл с помощью numpy.memmap. Это создает файл непосредственно на диске без выделения памяти, но не сохраняет метаданные, поэтому, когда я повторно перепечатываю файл позже, мне нужно знать его тип, форму и т.д. Далее следует заметить, что не указывать результаты формы в memmap интерпретируется как плоский массив:

    In [77]: x=memmap('/tmp/x', int, 'w+', shape=(3,3))
    
    
    In [78]: x
    Out[78]: 
    memmap([[0, 0, 0],
           [0, 0, 0],
           [0, 0, 0]])
    
    
    In [79]: y=memmap('/tmp/x', int, 'r')
    
    
    In [80]: y
    Out[80]: memmap([0, 0, 0, 0, 0, 0, 0, 0, 0])
    
  • Создайте массив в памяти, сохраните его с помощью numpy.save, после чего его можно загрузить в режиме memmapped. Это записывает метаданные с данными массива на диск, но требует, чтобы память была распределена для всего массива хотя бы один раз.

4b9b3361

Ответ 1

У меня был тот же вопрос, и я был разочарован, когда я прочитал ответ Свена. Кажется, что numpy будет отсутствовать на некоторых ключевых функциях, если вы не можете иметь огромный массив в файле и работать с небольшими частями одновременно. Ваше дело, похоже, близко к одному из вариантов использования в исходном рациональном для создания формата .npy(см. http://svn.scipy.org/svn/numpy/trunk/doc/neps/npy-format.txt).

Затем я столкнулся с numpy.lib.format, который, по-видимому, является полным полезным плюсом. Я понятия не имею, почему эта функция недоступна из корневого пакета numpy. Ключевым преимуществом перед HDF5 является то, что он поставляется с numpy.

>>> print numpy.lib.format.open_memmap.__doc__

"""
Open a .npy file as a memory-mapped array.

This may be used to read an existing file or create a new one.

Parameters
----------
filename : str
    The name of the file on disk. This may not be a filelike object.
mode : str, optional
    The mode to open the file with. In addition to the standard file modes,
    'c' is also accepted to mean "copy on write". See `numpy.memmap` for
    the available mode strings.
dtype : dtype, optional
    The data type of the array if we are creating a new file in "write"
    mode.
shape : tuple of int, optional
    The shape of the array if we are creating a new file in "write"
    mode.
fortran_order : bool, optional
    Whether the array should be Fortran-contiguous (True) or
    C-contiguous (False) if we are creating a new file in "write" mode.
version : tuple of int (major, minor)
    If the mode is a "write" mode, then this is the version of the file
    format used to create the file.

Returns
-------
marray : numpy.memmap
    The memory-mapped array.

Raises
------
ValueError
    If the data or the mode is invalid.
IOError
    If the file is not found or cannot be opened correctly.

See Also
--------
numpy.memmap
"""

Ответ 2

Как вы выяснили, NumPy в основном нацелена на обработку данных в памяти. Существуют разные библиотеки для обработки данных на диске, наиболее часто используемые сегодня, возможно, HDF5. Я предлагаю взглянуть на h5py, отличную оболочку Python для библиотек HDF5. Он предназначен для использования вместе с NumPy, и его интерфейс легко узнать, если вы уже знаете NumPy. Чтобы получить представление о том, как он решает вашу проблему, прочитайте документацию наборов данных.

Для полноты я должен упомянуть PyTables, который, по-видимому, является "стандартным" способом обработки больших наборов данных в Python. Я не использовал его, потому что h5py больше обращался ко мне. В обеих библиотеках есть элементы часто задаваемых вопросов, определяющие их область действия по отношению к другой.