numpy配列として簡単に読み戻すことができるようにディスクに書き込む場合は、を参照してくださいnumpy.save
。ピクルス処理も問題なく動作しますが、大規模な配列の場合は効率が低下します(実際の配列ではそうではないため、どちらでも問題ありません)。
人間が読めるようにしたい場合は、を調べてくださいnumpy.savetxt
。
編集: つまり、savetxt
2次元を超える配列のオプションとしてはそれほど優れていないようです...しかし、すべてを引き出すだけで完全な結論が得られます。
numpy.savetxt
2次元を超えるndarrayのチョークに気づいたところです...テキストファイルで追加の次元を示すための本質的に定義された方法がないため、これはおそらく設計によるものです。
たとえば、これ(2D配列)は正常に動作します
import numpy as np
x = np.arange(20).reshape((4,5))
np.savetxt('test.txt', x)
TypeError: float argument required, not numpy.ndarray
3D配列の場合、同じことは失敗します(かなり有益ではないエラー:) 。
import numpy as np
x = np.arange(200).reshape((4,5,10))
np.savetxt('test.txt', x)
1つの回避策は、3D(またはそれ以上)の配列を2Dスライスに分割することです。例えば
x = np.arange(200).reshape((4,5,10))
with file('test.txt', 'w') as outfile:
for slice_2d in x:
np.savetxt(outfile, slice_2d)
ただし、私たちの目標は、はっきりと人間が読めるようにすると同時に、で簡単に読み返すことnumpy.loadtxt
です。したがって、もう少し冗長にして、コメント化された行を使用してスライスを区別することができます。デフォルトでnumpy.loadtxt
は、で始まる行#
(またはcomments
kwargで指定された文字)を無視します。(これは実際よりも冗長に見えます...)
import numpy as np
# Generate some test data
data = np.arange(200).reshape((4,5,10))
# Write the array to disk
with open('test.txt', 'w') as outfile:
# I'm writing a header here just for the sake of readability
# Any line starting with "#" will be ignored by numpy.loadtxt
outfile.write('# Array shape: {0}\n'.format(data.shape))
# Iterating through a ndimensional array produces slices along
# the last axis. This is equivalent to data[i,:,:] in this case
for data_slice in data:
# The formatting string indicates that I'm writing out
# the values in left-justified columns 7 characters in width
# with 2 decimal places.
np.savetxt(outfile, data_slice, fmt='%-7.2f')
# Writing out a break to indicate different slices...
outfile.write('# New slice\n')
これにより、
# Array shape: (4, 5, 10)
0.00 1.00 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00
10.00 11.00 12.00 13.00 14.00 15.00 16.00 17.00 18.00 19.00
20.00 21.00 22.00 23.00 24.00 25.00 26.00 27.00 28.00 29.00
30.00 31.00 32.00 33.00 34.00 35.00 36.00 37.00 38.00 39.00
40.00 41.00 42.00 43.00 44.00 45.00 46.00 47.00 48.00 49.00
# New slice
50.00 51.00 52.00 53.00 54.00 55.00 56.00 57.00 58.00 59.00
60.00 61.00 62.00 63.00 64.00 65.00 66.00 67.00 68.00 69.00
70.00 71.00 72.00 73.00 74.00 75.00 76.00 77.00 78.00 79.00
80.00 81.00 82.00 83.00 84.00 85.00 86.00 87.00 88.00 89.00
90.00 91.00 92.00 93.00 94.00 95.00 96.00 97.00 98.00 99.00
# New slice
100.00 101.00 102.00 103.00 104.00 105.00 106.00 107.00 108.00 109.00
110.00 111.00 112.00 113.00 114.00 115.00 116.00 117.00 118.00 119.00
120.00 121.00 122.00 123.00 124.00 125.00 126.00 127.00 128.00 129.00
130.00 131.00 132.00 133.00 134.00 135.00 136.00 137.00 138.00 139.00
140.00 141.00 142.00 143.00 144.00 145.00 146.00 147.00 148.00 149.00
# New slice
150.00 151.00 152.00 153.00 154.00 155.00 156.00 157.00 158.00 159.00
160.00 161.00 162.00 163.00 164.00 165.00 166.00 167.00 168.00 169.00
170.00 171.00 172.00 173.00 174.00 175.00 176.00 177.00 178.00 179.00
180.00 181.00 182.00 183.00 184.00 185.00 186.00 187.00 188.00 189.00
190.00 191.00 192.00 193.00 194.00 195.00 196.00 197.00 198.00 199.00
# New slice
元の配列の形状がわかっていれば、それを読み取るのは非常に簡単です。できるだけですnumpy.loadtxt('test.txt').reshape((4,5,10))
。例として(これを1行で行うことができますが、私は説明を明確にするために冗長にしています):
# Read the array from disk
new_data = np.loadtxt('test.txt')
# Note that this returned a 2D array!
print new_data.shape
# However, going back to 3D is easy if we know the
# original shape of the array
new_data = new_data.reshape((4,5,10))
# Just to check that they're the same...
assert np.all(new_data == data)
numpy.loadtxt
(docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.htmlを)