/ / H5PY / Numpy - numpy配列の内部形状を設定する(h5pyの場合) - python、numpy、h5py

H5PY / Numpy - numpy配列の内部形状を設定する(h5py用) - python、numpy、h5py

私は(画像、アングル)のタプルのリストとしてデータを格納するために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