質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

6044閲覧

python HDF5 保存したデータに追記する方法(mode='a'の使い方)

Flan.

総合スコア123

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/02 03:07

HDF5で作ったデータセットに追記したいです
参考
https://qiita.com/simonritchie/items/23db8b4cb5c590924d95

ファイルの書き込みと読み込みまではできたのですが
参考にはmode='a'について書かれておらず
すでに作ったファイルに追記する方法がわからず困っています

h5py.Fileのmode=aの正しい使い方を知ってる人教えてください
試したこと

import numpy as np import h5py import time arr=np.random.rand(10,10) with h5py.File('replay_deta/sample.hdf5', mode='a') as f: group = f.create_dataset(name='/appele',data=arr) print(arr)
--------------------------------------------------------------------------- OSError Traceback (most recent call last) <ipython-input-3-6156a71486b0> in <module> 5 arr=np.random.rand(10,10) 6 with h5py.File('replay_deta/sample.hdf5', mode='a') as f: ----> 7 group = f.create_dataset(name='/appele',data=arr) 8 print(arr) ~\Anaconda3\envs\pyflan\lib\site-packages\h5py\_hl\group.py in create_dataset(self, name, shape, dtype, data, **kwds) 137 dset = dataset.Dataset(dsid) 138 if name is not None: --> 139 self[name] = dset 140 return dset 141 ~\Anaconda3\envs\pyflan\lib\site-packages\h5py\_hl\group.py in __setitem__(self, name, obj) 371 372 if isinstance(obj, HLObject): --> 373 h5o.link(obj.id, self.id, name, lcpl=lcpl, lapl=self._lapl) 374 375 elif isinstance(obj, SoftLink): h5py\_objects.pyx in h5py._objects.with_phil.wrapper() h5py\_objects.pyx in h5py._objects.with_phil.wrapper() h5py\h5o.pyx in h5py.h5o.link() OSError: Unable to create link (name already exists)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

h5py.Fileのmode='a'は、
[読み込み、書き込み]モードのことで、
追記する機能ではありません

h5pyのドキュメント

追記は、以下手順でできます

  1. mode='a'で読み込んでデータを取得し、
  2. 取得したデータに追記し、
  3. ファイル内のDBを削除し、
  4. 追記したデータを記載する

python

1import numpy as np 2import h5py 3import time 4arr=np.random.rand(10,10) 5with h5py.File('sample.hdf5', mode='a') as f: 6 #1 7 arr2 = f["appele"].value 8 #2 9 arr3 = np.concatenate([arr2,arr]) 10 #3 11 del f["appele"] 12 #4 13 group = f.create_dataset(name='/appele',data=arr3) 14print(arr)

投稿2020/11/04 02:32

Moineau26518805

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

すでに存在するdatasetと同じ名前で再度datasetを作ろうとしてエラーになっているようです。
別の名前にすれば解決すると思います。

同じ名前のデータセットで値を更新したい場合は下記のようにします。
...(Ellipsis)を使っている例をよく見ますが、空のスライスでも動きます。

python

1import numpy as np 2import h5py 3 4arr = np.random.rand(10, 10) 5with h5py.File('replay_deta/sample.hdf5', mode='a') as f: 6 dataset = f['appele'] 7 dataset[...] = arr # dataset[:] = arr でもOK

既存のものを削除してから再作成でもできます。
確認したことはないですが、なんとなく効率が悪そうな気がします。
型やサイズが変わる場合は上の方法ではできないので、こちらのやり方になります。

python

1import numpy as np 2import h5py 3 4arr = np.random.rand(10, 10) 5with h5py.File('replay_deta/sample.hdf5', mode='a') as f: 6 del f['appele'] 7 group = f.create_dataset(name='/appele', data=arr)

投稿2020/11/04 01:03

bsdfan

総合スコア4794

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問