Можно ли перетасовать порядок массивов в файле .npz? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть массив массивов, которые я сохраняю в файл .npz, используя

np.savez('test2.npz', *NumpyArrayOfArrays)

Мне было интересно, можно ли перетасовать порядок, в котором сохраняются массивы.

Я пытался

np.random.shuffle (тестирование)

Не работает

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Если я начну с (4,3) массива:

In [92]: arr
Out[92]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

и сохраню его как вы, *arr будет обрабатывать его как список 1d массивов (строк), сохраняя каждый вОтдельный файл в npz архиве:

In [93]: np.savez('test.npz', *arr)

load дает мне словарь этих массивов:

In [94]: d = np.load('test.npz')
In [96]: list(d.keys())
Out[96]: ['arr_0', 'arr_1', 'arr_2', 'arr_3']
In [97]: d['arr_1']
Out[97]: array([3, 4, 5])

Или используя ОС unzip для просмотра архива:

In [101]: !unzip -v test.npz
Archive:  test.npz
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
     152  Stored      152   0% 1980-01-01 00:00 ea1240f7  arr_0.npy
     152  Stored      152   0% 1980-01-01 00:00 c2903dd0  arr_1.npy
     152  Stored      152   0% 1980-01-01 00:00 987e678b  arr_2.npy
     152  Stored      152   0% 1980-01-01 00:00 fcae29f8  arr_3.npy
--------          -------  ---                            -------
     608              608   0%                            4 files

Помимо имен, «порядок сохранения» на самом деле не имеет значения.Или, по крайней мере, я не понимаю, почему вас это волнует.

В качестве альтернативы я мог бы установить имена файлов архива с использованием словарного подхода

In [114]: names = ['w','x','y','z']
In [115]: dd = {n:v for n,v in zip(names,arr)}
In [116]: dd
Out[116]: 
{'w': array([0, 1, 2]),
 'x': array([3, 4, 5]),
 'y': array([6, 7, 8]),
 'z': array([ 9, 10, 11])}
In [117]: np.savez('test.npz', **dd)
In [118]: d = np.load('test.npz')
In [119]: list(d.keys())
Out[119]: ['w', 'x', 'y', 'z']
In [120]: d['x']
Out[120]: array([3, 4, 5])

In [121]: !unzip -v test.npz
Archive:  test.npz
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
     152  Stored      152   0% 1980-01-01 00:00 ea1240f7  w.npy
     152  Stored      152   0% 1980-01-01 00:00 c2903dd0  x.npy
     152  Stored      152   0% 1980-01-01 00:00 987e678b  y.npy
     152  Stored      152   0% 1980-01-01 00:00 fcae29f8  z.npy
--------          -------  ---                            -------
     608              608   0%                            4 files

Я могу использовать словарные методы для извлечения значений изархив:

In [122]: list(d.items())
Out[122]: 
[('w', array([0, 1, 2])),
 ('x', array([3, 4, 5])),
 ('y', array([6, 7, 8])),
 ('z', array([ 9, 10, 11]))]
In [123]: list(d.values())
Out[123]: [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10, 11])]
In [124]: np.stack(_)
Out[124]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
0 голосов
/ 17 октября 2018

Вы пробовали старый добрый random.shuffle()?

import random
np.savez('test2.npz', *random.shuffle(NumpyArrayOfArrays))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...