2016-02-01 3 views
7

私は配列の異なる形状に取り組んでいくつかの配列を保存し、私はnumpy.saveでそれらすべてを保存したいので、私はそれが動作はnumpyのは、かつて

mat1 = numpy.arange(8).reshape(4, 2) 
mat2 = numpy.arange(9).reshape(2, 3) 
numpy.save('mat.npy', numpy.array([mat1, mat2])) 

を持って検討してください。しかし、同じサイズの1つの次元を持つ2つの行列がある場合、それは機能しません。

mat1 = numpy.arange(8).reshape(2, 4) 
mat2 = numpy.arange(10).reshape(2, 5) 
numpy.save('mat.npy', numpy.array([mat1, mat2])) 

それは
Traceback (most recent call last): File "<input>", line 1, in <module> ValueError: could not broadcast input array from shape (2,4) into shape (2)

を引き起こし、numpy.save

によってnumpy.array([mat1, mat2])としないことによって生じた問題は、私は、そのような配列が可能であることを知っていることに注意してください:だから

>> numpy.array([[[1, 2]], [[1, 2], [3, 4]]]) array([[[1, 2]], [[1, 2], [3, 4]]], dtype=object)

、私が望むのは、twを節約することです配列をmat1およびmat2とした。

+0

代わりにバイナリプロトコルで 'np.savez'またはpickleを使用することを検討しましたか? 'savez'は複数の配列を保存し、' save'は一つの配列だけを保存します。 –

+0

私のコンピュータで動作します。どのバージョンのPythonを使用していますか? – CoMartel

答えて

6

np.saveと同じ形式で複数のアレイを保存する場合は、np.savezを使用してください。例えば

import numpy as np 

arr1 = np.arange(8).reshape(2, 4) 
arr2 = np.arange(10).reshape(2, 5) 
np.savez('mat.npz', name1=arr1, name2=arr2) 

data = np.load('mat.npz') 
print data['name1'] 
print data['name2'] 

あなたは、いくつかの配列を持っている場合は、引数を展開することができます。順序が保存されないことを

import numpy as np 

data = [np.arange(8).reshape(2, 4), np.arange(10).reshape(2, 5)] 
np.savez('mat.npz', *data) 

container = np.load('mat.npz') 
data = [container[key] for key in container] 

注意を。注文を保存する必要がある場合は、pickleを代わりに使用することを検討してください。

pickleを使用する場合は、バイナリプロトコルを指定する必要があります。そうしないと、ascii pickleを使用して書き込むことになります。これはnumpy配列に対して特に非効率的です。バイナリプロトコルでは、は、多かれ少なかれ、np.save/np.savezと同じフォーマットになります。例えばこの場合

# Note: This is Python2.x specific. It's identical except for the import on 3.x 
import cPickle as pickle 
import numpy as np 

data = [np.arange(8).reshape(2, 4), np.arange(10).reshape(2, 5)] 

with open('mat.pkl', 'wb') as outfile: 
    pickle.dump(data, outfile, pickle.HIGHEST_PROTOCOL) 

with open('mat.pkl', 'rb') as infile: 
    result = pickle.load(infile) 

resultdataは、同一の内容を有し、アレイの入力リストの順序は保持されます。

+0

私は配列のリストを持っていると私はそれらをすべて保存し、その後にすべてをロードしたいと考えています。 – Dubon

+0

また、私が書いた一般的な問題に対する解決策がありますか? – Dubon

+0

@ドゥボン - 私はあなたが「一般的な問題」によって何を指しているのかよく分かりません。任意のpythonオブジェクトのディスクへの書き込み/読み出しを意味する場合、 'pickle'はあなたが探しているものです。 –

関連する問題