Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use numpy.load on file within zipfile

I have a zipfile which contains many npy files (file1.npy, file2.npy, file3.npy, ...). I would like to load them individually without extracting the zipfile on a filesystem. I have tried many things but I can't figure it out.

My guess was:

import zipfile
import numpy as np

a = {}

with zipfile.ZipFile('myfiles.zip') as zipper:
    for p in zipper.namelist():
        with zipper.read(p) as f:
            a[p] = np.load(f)

Any ideas?

like image 632
Sigmun Avatar asked Sep 11 '25 21:09

Sigmun


1 Answers

Save 2 arrays, each to their own file:

In [452]: np.save('x.npy',x)
In [453]: np.save('y.npy',y)

With a file browser tool, create a zip file, and try to load it:

In [454]: np.load('xy.zip')
Out[454]: <numpy.lib.npyio.NpzFile at 0xb48968ec>

Looks like np.load detected the zip nature (independent of the name), and returned a NpzFile object. Let's assign it to a variable, and try the normal .npz extract:

In [455]: xy=np.load('xy.zip')

In [456]: xy['x']
Out[456]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

In [457]: xy['y']
Out[457]: 
array([[ 0,  4,  8],
       [ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11]])

So load can perform the lazy load on any zip file of npy files, regardless of how it's created.

like image 116
hpaulj Avatar answered Sep 13 '25 12:09

hpaulj