文字列になったNumPy配列をNumPy配列として扱えるようにするPythonプログラム
テキストファイルに保存して、文字列になったNumPy配列を数字データにしてから、NumPy配列として扱えるようにするPythonプログラムを紹介します。
他にテキストファイルについて投稿しているのがこちら↓
「Pythonでテキストファイルの書き込み、読み込み、追記について」
目次
・テキストファイルに文字列を書き込む(保存)
・文字列をNumPy配列として扱えるようにするプログラム
テキストファイルに文字列を書き込む(保存)
1 2 3 4 5 6 7 8 9 10 |
import numpy as np np_data=np.arange(18).reshape(3,6)#0~17の数字で3行6列のnumpy配列を作成 data=str(np_data) #書き込み with open("array_moji.txt","w") as tw: tw.write(data) print(data) |
0~17の数字で3行6列のNumPy配列を作成して、テキストファイルに保存しています。
NumPy配列をそのままテキストファイルに保存できないので、str関数で文字列に変換しています。
実行結果

テキストファイル(メモ帳)に保存された様子

文字列をNumPy配列として扱えるようにするプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import numpy as np #テキストファイルから読み込み with open("np_moji.txt","r") as tr: t_data=tr.read() print(t_data) print(type(t_data))#数字や記号、スペース、改行コードなど、すべてのデータが文字になる list_d=[]#文字からリストにしたすべてのデータが入る row_d=[]#Numpy配列の各行の文字データ入る moji=[]#文字の数字が入る for i in range(len(t_data)): if t_data[i] == "[" or t_data[i] == "\n": #文字データに"["または"\n"があればcontinue continue if t_data[i] == " " or t_data[i] == "]": if len(moji) == 0:#文字の数字データがリストに入っていない場合は、continue continue link=""#2桁の数字を繋げる。例:1","0"を"10"にする for m in moji:#文字の数字の個数繰り返す。例:"1"は1回 、10の"1","0"は2回 link+=m row_d.append(int(link))#文字の数字を整数に変換 moji=[] if t_data[i] == "]":#閉じカッコまで繰り返された場合は、list_dにデータを追加 list_d.append(row_d) row_d=[] continue moji.append(t_data[i])#文字の数字を入れる np_d=np.array(list_d)#Numpyのarray関数を使って、リストをNumpy配列に変換 print(np_d) print(type(np_d)) print(np_d[0]) print(type(np_d[0])) |
プログラムの説明をします。
5,6行目はテキストファイルから文字列になったNumPy配列を読み込んでいます。
このNumPy配列を構成する文字列のデータは数字や記号、スペース、改行コードなど、すべてのデータが文字になっています。また、10や11など2桁の数字は“1”,”0″のように数字同士が分かれた文字になっています。
16行目のfor文は文字の個数の数繰り返します。
20行目から31行目は文字になった数字を整数にして、リストに追加しています。
36行目はリストをNumPy配列に変換しています。
※テキストファイルから読み込んだ文字列を直接、NumPyモジュールのarray関数を使って、NumPy配列に変換することはできるのですが、外側がNumPy形式になっているだけで、内側のデータはNumPy形式にならないです。
実行結果

41行目のprint(np_d[0])で、要素番号0のデータ[0 1 2 3 4 5]が取り出せています。
文字列の場合だと[0 1 2 3 4 5]は取り出せないです。