2016-11-07 3 views
1

リストに格納されている配列がnumpyです。これらの配列には個々の名前はなく、リストのインデックスで呼び出すだけです。numpy.loadは、savez'ed配列を間違った順序で取得します。

これらをすべてまとめて保存する必要があるため、numpy.savezを使用して1つのファイルに保存しました。私の配列は名前が付けられていないので、リストを列挙したところでnumpy.savezに自動名 "arr_0"、 "arr_1"などが割り当てられました。

しかし、すべて私がnumpy.loadを使ってそれらを検索しようとしたとき、私はnumpy.loadが一見ランダムな順序で配列をリストすることを発見しました。もちろん、配列をリストアする前にこのリストを並べ替えることはできますが、無名配列の順序付きリストを格納して取得するための簡単な方法はないというのが非常に奇妙です。ここで

事を実証するテストコードの一部です:

import numpy as np 

arr_list = [] 
for i in range(15): 
    arr_list.append(np.array(range(i, i+6)).reshape(2, 3)) 

np.savez('testfile', *arr_list) 
with np.load('testfile.npz') as data: 
    print(data.files) 

そして、ここでは、私が得るものです:

>>> ['arr_1', 'arr_3', 'arr_13', 'arr_11', 'arr_14', 'arr_10', 'arr_8', 'arr_0', 
    'arr_2', 'arr_9', 'arr_5', 'arr_4', 'arr_6', 'arr_12', 'arr_7'] 

多くはである何、私は二度同じ結果を得ることはありません。次の試み:結果は、私は必要なものではない(と私は、リスト内の10の以上の項目で例を挙げた理由です)として

>>> ['arr_6', 'arr_11', 'arr_10', 'arr_13', 'arr_0', 'arr_7', 'arr_5', 'arr_3', 
    'arr_14', 'arr_2', 'arr_8', 'arr_12', 'arr_1', 'arr_9', 'arr_4'] 

残念ながら私は、sorted()を使用してリストを並べ替えることができません。

>>> ['arr_0', 'arr_1', 'arr_10', 'arr_11', 'arr_12', 'arr_13', 'arr_14', 'arr_2', 
    'arr_3', 'arr_4', 'arr_5', 'arr_6', 'arr_7', 'arr_8', 'arr_9'] 

なぜnumpy.savez + numpy.loadがこのような奇妙な動作をするのかわかりません。私は何かを逃したのか、これを整理するために正規表現を使う必要がありますか?

+0

を再作成するか、 'data'は'経由で個々のアレイへのアクセスを許可するオブジェクトのような辞書は、ありますデータ['arr_0'] '。辞書のキーは順不同です。 – hpaulj

+0

@hpaulj: 'data'は辞書のようなものですが、' data.files'はそうではありません。 – pafcu

+0

意図的に、 'savez'文書の例では、変数名がシャッフルされています。その目的は配列がリスト順ではなく名前で返されることです。 – hpaulj

答えて

1

numpyでsavezの実装が原因です。 source code of savezを見ると、保存される配列のリスト(args引数に含まれる)が、格納される配列を含む辞書(kwargs引数)に追加されていることがわかります。 argsリスト内の配列の順序は、この段階で失われる可能性があります(使用されているPythonのバージョンによって異なります)。あなたはファイル名の形式を知っているので

あなたがそれらを

sorted_files = sorted(data.files, key=lambda x:int(x[4:])) 

をソートしたり、リスト

sorted_files = ['arr_{}'.format(i) for i in range(len(data.files))] 
+0

したがって、 'load'からの順序は' unzip -l'から取得する順序と同じです。 – hpaulj

+0

ドキュメントでこれを保証するものではありません。 'data.files'は、[ZipFile.namelist()'](https://docs.python.org/3/library/zipfile.html#zipfile.ZipFile.namelist)を呼び出して取得します。ファイル名は['ZipFile.infolist()'](https://docs.python.org/3/library/zipfile.html#zipfile.ZipFile.infolist)とは異なります。これは意図せぬ省略である可能性がありますが、あなたが信頼できるものではありません。 – pafcu

+0

@pafcu:あなたの説明をありがとう、最初の提案を使ってリストを並べ替えます。あなたの2番目の提案については、新しい名前付きリストを作成するだけで、データファイルを整理する手助けをしてくれないので、それが間違っているのではないかと心配しています。とにかく、配列の順序付きリストを格納して取り出すための単純で直接的なメカニズムが存在するはずであると考えるのを助けることはできません。私はこれを必要とする最初の人だとは信じられません... –

関連する問題