5

この特定の質問は、MATLABアルゴリズムによって生成された大きなデータセットを処理して、Pythonアルゴリズムで処理できるようにする試みから生じています。

背景: MATLABに大きな配列(通常は20x20x40x15000 [i、j、k、frame])があり、Pythonで使用したいと考えています。そこで、配列を* .matファイルに保存し、scipy.io.loadmat(fname)*。matファイルをnumpy配列に読み込むために使用します。ただし、Pythonで* .matファイル全体を読み込もうとすると、メモリエラーが発生するという問題が発生します。これを回避するために、*。matファイルを断片にスライスして、Python配列に一度に1つずつロードできるようにします。* .matをフレームで分割すると、15,000個の* .matファイルが作成され、(少なくともWindowsでは)すぐに操作するのが面倒になります。したがって、私の解決策は、zipファイルを使用することです。

質問: scipyを使用して、最初にファイルを現在の作業ディレクトリに解凍せずに、zipファイルから* .matファイルを直接読み取ることはできますか?

仕様: Python 2.7、Windows XP

現在のコード:

import scipy.io
import zipfile
import numpy as np

def readZip(zfilename,dim,frames):
    data=np.zeros((dim[0],dim[1],dim[2],frames),dtype=np.float32)
    zfile = zipfile.ZipFile( zfilename, "r" )
    i=0
    for info in zfile.infolist():
        fname = info.filename
        zfile.extract(fname)
        mat=scipy.io.loadmat(fname)
        data[:,:,:,i]=mat['export']
        mat.clear()
        i=i+1
    return data

試したコード:

mat=scipy.io.loadmat(zfile.read(fname))

このエラーが発生します:

TypeError: file() argument 1 must be encoded string without NULL bytes, not str

mat=scipy.io.loadmat(zfile.open(fname))

このエラーが発生します:

fileobj.seek(0)
UnsupportedOperation: seek

データの取り扱いに関するその他の提案は大歓迎です。

ありがとう!

4

2 に答える 2

3

私の質問に対する答えはNOであり、私がやろうとしていることを達成するためのより良い方法があると確信しています。

とにかく、JFセバスティアンからの提案で、私は解決策を考案しました。

解決策:データをMATLABでHDF5形式で保存しますhdf5write(fname, '/data', data_variable)。これにより、*。h5ファイルが生成され、h5pyを介してPythonに読み込むことができます

Pythonコード:

import h5py

r = h5py.File(fname, 'r+')
data = r['data']

これで、データに直接インデックスを付けることができますが、ハードドライブに残ります。

print data[:,:,:,1]

または、メモリにロードすることもできます。

data_mem = data[:]

ただし、これもまたメモリエラーを引き起こします。それで、それをメモリに入れるために、私は各フレームをループして、それをnumpy配列に追加することができます。

h5py FTW!

于 2012-06-20T19:32:36.353 に答える
0

私のフリーズしたアプリケーションの 1 つで、いくつかのファイルを py2exe が作成する .bin ファイルにバンドルし、次のように引き出します。

z = zipfile.ZipFile(os.path.join(myDir, 'common.bin'))

data = z.read('schema-new.sql')

それが .mat ファイルを scipy にフィードするかどうかはわかりませんが、試してみる価値があると思います。

于 2012-06-19T17:27:03.660 に答える