3

次のジェネレータ関数を考えると...

def loadrun(runs, varnames=None):
    for fle in runs:
        yield loadmat(fle, variable_names=varnames)

これを次のように呼びます...

vnames = ['targetpos', 'cuepos', 'soa', 'response']
trials = loadrun(datafiles, vnames)  # datafiles is a list of paths to files

結果のdictの長さをリストすると、次の出力が得られます。

[in] for t in trials:
         print len(t)

[out] 7
      128
      128
      128
      128
      128
      128
      128

すべての.matファイルには 124 個の変数が含まれているため、最初の出力のみが正しいです。何を与える?

編集

問題の範囲をさらに縮小しました。ループloadmatの最初の繰り返しのvariable_names後で、フィールドが失敗したように見えます。ここで何が起こっているのか分かりますか?

for df in datafiles:
    print len(loadmat(df, variable_names=vnames))

[out] 7
      128
      128
      128
      128
      128
      128
      128
4

1 に答える 1

2

scipy.io.loadmatいたずら[1]であり、 に渡されたリストを変更していvariable_namesます。への最初の呼び出しの後、loadmatvarnames空のリストです。

一時変数を定義することで、これを回避できます_varnames

def loadrun(runs, varnames = None):
    for fle in runs:
        _varnames = None if varnames is None else varnames[:]
        yield sio.loadmat(fle, variable_names = _varnames)

例えば:

import string
import scipy.io as sio
import numpy as np

letters = string.ascii_lowercase
datafiles = ['/tmp/data{i:d}.mat'.format(i = i) for i in range(3)]

def loadrun(runs, varnames = None):
    for fle in runs:
        _varnames = None if varnames is None else varnames[:]
        yield sio.loadmat(fle, variable_names = _varnames)

def create_datafiles():
    for filename in datafiles:
        arr = np.arange(9).reshape((3, 3))
        mdict = {letter : arr for letter in letters}
        sio.savemat(filename, mdict = mdict)

create_datafiles()
vnames = ['a', 'c', 'd']
trials = loadrun(datafiles, vnames)
for t in trials:
    print(t.keys())

実際には、問題は mio4.py と mio5.py の両方で発生してMatFile4ReaderいるMatFile5Readerようremoveですvariable_names

def get_variables(self, variable_names=None):
    while not self.end_of_stream():
        ...
        if variable_names:
            variable_names.remove(name)
            if len(variable_names) == 0:
                break
于 2012-11-14T10:56:32.130 に答える