私は(画像、アングル)のタプルのリストとしてデータを格納するためにh5pyを使用しようとしています。画像は、OpenCVのuint8型のサイズ(240,320,3)のnumpy配列ですが、角度はfloat16型の数値にすぎません。
h5pyを使用する場合は、事前定義されている必要があります読取り/書込みの使用可能な速度を維持するために、形状を変えることができる。 H5pyは、データセット全体を任意の値で事前ロードします。この値で後でインデックスを作成し、これらの値を任意の値に設定できます。
私は、h5pyのデータセットの形状を初期化するときに、内部numpy配列の形状を設定する方法を知りたいと思います。私は、同じ解決策が同様にnumpyにも適用されると信じています。
import h5py
import numpy as np
dset_length = 100
# fake data of same shape
images = np.ones((dset_length,240,320,3), dtype="uint8") * 255
# fake data of same shape
angles = np.ones(dset_length, dtype="float16") * 90
f = h5py.File("dataset.h5", "a")
dset = f.create_dataset("dset1", shape=(dset_length,2))
for i in range(dset_length):
# does not work since the shape of dset[0][0] is a number,
# and can"t store an array datatype
dset[i] = np.array((images[i],angles[i]))
numpyで問題を再作成すると、次のようになります。
import numpy as np
a = np.array([
[np.array([0,0]), 0],
[np.array([0,0]), 0],
[np.array([0,0]), 0]
])
a.shape # (3, 2)
b = np.empty((3,2))
b.shape # (3, 2)
a[0][0] = np.array([1,1])
b[0][0] = np.array([1,1]) # ValueError: setting an array element with a sequence.
回答:
回答№1は2ザ dtype
それ @Eric
両方を使って作成する必要があります numpy
そして h5py
。しかし、あなたが本当にそれを望んでいるのか必要があるのか疑問に思います代わりに2つの配列を numpy
, images
そして angles
、1つは4d uint8
、もう一つのフロート。に h5py
あなたは group
、これら2つの配列を datasets
.
あなたは値を選択することができます ith"
イメージ
images[i,...], angles[i] # or
data[i]["image"], data[i]["angle"]
例えば:
import h5py
dt = np.dtype([("angle", np.float16), ("image", np.uint8, (40,20,3))])
data = np.ones((3,), dt)
f = h5py.File("test.h5","w")
g = f.create_group("data")
コンパウンドdtypeを持つデータセット:
g.create_dataset("data", (3,), dtype=dt)
g["data"][:] = data
2つの配列を持つデータセット
g.create_dataset("image", (3,40,20,3), dtype=np.uint8)
g.create_dataset("angle", (3,), dtype=np.float16)
g["image"][:] = data["image"]
g["angle"][:] = data["angle"]
どちらのデータセットからも角度配列をフェッチする:
g["data"]["angle"][:]
g["angle"][:]
回答№2については2
numpyでは、そのデータを構造化配列に格納できます。
dtype = np.dtype([("angle", np.float16), ("image", np.uint8, (240,320,3))])
data = np empty(10, dtype=dtype)
data[0]["angle"] = ... # etc