Как записать много ndarray в файл, где каждый ndarray сохраняется в одной строке? - PullRequest
2 голосов
/ 17 апреля 2020

У меня есть много ndarray объектов для сохранения. И я хочу сохранить этот ndarray один за другим, что означает, что каждый ndarray сохраняется в одной строке в файле. Я обнаружил, что np.savez кажется бесполезным для этого случая. Как я могу это сделать? Спасибо!

Я пробовал так:

При сохранении этих ndarrays,

with open(file, 'a') as f:
  for i in range(n)
    f.write(str(ndarry[i].tostring()) + '\n')

И при загрузке и восстановлении их,

list_array = []
with open(file, 'a') as f:
  line = f.reanline().strip('\n')
  while line
    ndarray = np.fromstring(line, dtype=np.int64).reshape((2,3))
    list_array.append(ndarray)
    line = f.reanline().strip('\n')

Но я получил «ValueError: размер строки должен быть кратным размеру элемента»

1 Ответ

0 голосов
/ 17 апреля 2020

Вы пытались отладить запись / чтение строки только для одного массива? Посмотрите на шаги в деталях?

In [568]: arr = np.arange(3)                                                                           
In [569]: arr                                                                                          
Out[569]: array([0, 1, 2])
In [570]: arr.tostring()                                                                               
Out[570]: b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00'

b говорит нам, что это строка байтов (как старые строки py2). Затем вы 'оборачиваете' его в строку py3:

In [571]: str(arr.tostring())+'\n'                                                                     
Out[571]: "b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\n"

Теперь попробуйте прочитать:

In [572]: _.strip('\n')                                                                                
Out[572]: "b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00'"
In [573]: np.fromstring(_, np.int64)                                                                   
/usr/local/bin/ipython3:1: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  #!/usr/bin/python3
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-573-fa8feb7879b7> in <module>
----> 1 np.fromstring(_, np.int64)

ValueError: string size must be a multiple of element size

Я могу восстановить исходный массив из вывода tostring:

In [574]: np.frombuffer(arr.tostring(), np.int64)                                                      
Out[574]: array([0, 1, 2])

Все эти str и символы новой строки для записи двоичной строки в файл портят чтение.

...