前提・実現したいこと
npzから、pngに直したいと考えております。
ですが、エラーがでてしまいました。
どのようにしたら、pngになおせるのか、わかりかねている次第です。
発生している問題・エラーメッセージ
AttributeError Traceback (most recent call last) <ipython-input-27-208dfd64eac4> in <module>() 3 # f = np.asarray(f) 4 # f = Image.fromarray(f.astype('uint8')) ----> 5 f = Image.fromarray(f) 6 7 /usr/local/lib/python3.7/dist-packages/PIL/Image.py in fromarray(obj, mode) 2702 .. versionadded:: 1.1.6 2703 """ -> 2704 arr = obj.__array_interface__ 2705 shape = arr["shape"] 2706 ndim = len(shape) AttributeError: 'str' object has no attribute '__array_interface__'
該当のソースコード
for idx, f in enumerate(A): from PIL import Image # f = np.asarray(f) # f = Image.fromarray(f.astype('uint8')) f=np.load(f) f = Image.fromarray(f.astype(np.uint8)) im.save(f"/content/drive/MyDrive/神様/sartorius-inserted/train_sample_npy_to_pnp/{f[-16:-4]}.jpeg")
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
Python3 (3.7.4)
macbookpro 16
1,
np.loadを追加後
1--------------------------------------------------------------------------- 2AttributeError Traceback (most recent call last) 3<ipython-input-37-df6ebf7b8628> in <module>() 4 5 # f = Image.fromarray(f.astype('uint8')) 5 6 f=np.load(f) 6----> 7 f = Image.fromarray(f) 7 8 print(f) 8 9/usr/local/lib/python3.7/dist-packages/PIL/Image.py in fromarray(obj, mode) 10 2702 .. versionadded:: 1.1.6 11 2703 """ 12-> 2704 arr = obj.__array_interface__ 13 2705 shape = arr["shape"] 14 2706 ndim = len(shape) 15 16AttributeError: 'NpzFile' object has no attribute '__array_interface__' 17
2,
rgbで変化なしです。
3,
np.loadで読み込まないと
https://python.atelierkobato.com/npsave/#outline__2
の「numpy.savez()」を見てください
jbpb0さん、ご返信ありがとうございます。こちらでも、おこなってみたのですが、このようなエラーが登場してしまいました。
上記です。
以前の質問で PNG を pickle 化して保存する、という様な事をされていたかと思いますが、もしかして読み込もうとしている npz ファイルの中身は pickle ですか?
npzでございます。
はい、了解です。npz ファイルをどうやって作成したのかが判ればエラーの原因が分かるかもしれません。
https://www.kaggle.com/dschettler8845/open-npz
このようにしてでございます。
for idx, f in enumerate(A):
from PIL import Image
# f = np.asarray(f)
# f = Image.fromarray(f.astype('uint8'))
ff = f[-16:-4]
f=np.load(f)
print(f[f'{ff}'])
https://note.nkmk.me/python-numpy-load-save-savez-npy-npz/
このような感じで行った見たのですが、ヒントになりますでしょうか、エラーでしたが。笑。
> 6 f=np.load(f)
----> 7 f = Image.fromarray(f)
https://stackoverflow.com/questions/53969450/create-image-with-pil-image-fromarray-results-in-attributeerror-list-object/53969526
とか見ると分かると思いますが、
f = Image.fromarray(f)
は、「f」がnumpy.ndarrayじゃないとできません
f=np.load(f)
のすぐ下に
print(type(f))
を追加して実行してみてください
「f」はnumpy.ndarrayでしょうか?
<ipython-input-49-94211bc3e20d> in <module>()
6 ff = f[-16:-4]
7 f=np.load(f)
----> 8 print(f[f'{ff}'])
9
10 # print(f.dtype)
/usr/local/lib/python3.7/dist-packages/numpy/lib/npyio.py in __getitem__(self, key)
257 return self.zip.read(key)
258 else:
--> 259 raise KeyError("%s is not a file in the archive" % key)
260
261
KeyError: '0140b3c8f445 is not a file in the archive'
<class 'numpy.lib.npyio.NpzFile'>
<class 'numpy.lib.npyio.NpzFile'>
<class 'numpy.lib.npyio.NpzFile'>
https://note.nkmk.me/python-numpy-load-save-savez-npy-npz/
こちらをnpzは参考にしました。
なるほど、複数のファイルを束ねて一つの npz にしたのですね。
print(type(f))
を実行したら、「f」がnumpy配列なら「<class 'numpy.ndarray'>」と表示されますが、
> <class 'numpy.lib.npyio.NpzFile'>
だから違うのでダメです
f=np.load(f)
の後に、「f」から中身(numpy配列)を取り出さないといけません
print(type(f))
の代わりに、
print(f.files)
を追加して実行してみてください
そうすれば、「f」の中身の名前が表示されますので、その名前を使って取り出します
たとえば
['arr_0', 'arr_1']
と表示された場合は、下記で中身が取り出せます
f['arr_0']
f['arr_1']
これはnumpy配列なので、「Image.fromarray」に渡せます
【追記】
質問者さんが参考にした
https://note.nkmk.me/python-numpy-load-save-savez-npy-npz/
にも、下記のように同じ事が書いてありました
「格納されたndarrayを取得するには、各ndarrayの名前を[]で指定する必要がある。各ndarrayの名前はfiles属性で確認できる。」
> https://www.kaggle.com/dschettler8845/open-npz
このようにしてでございます。
のコードでも、
npz_test = np.load("../input/sartorius-segmentation-train-mask-dataset-npz/0030fd0e6378.npz")["arr_0"]
と、「np.load」の結果に「["arr_0"]」を付けて、中身を取り出してますよね
そんなやり方も存在したのですね。ありがとうございます。
npzファイルの中身が一つだけならそれでもいいですが、複数あるなら
np.load("*.npz")["arr_0"]
np.load("*.npz")["arr_1"]
と何回も「np.load」を実行するのは無駄なので、
z=np.load("*.npz")
z["arr_0"]
z["arr_1"]
のように「np.load」の結果を変数に格納してから、その変数から一つずつ取り出す方がいいと思います
回答1件
あなたの回答
tips
プレビュー

