Package that integrates NumPy Arrays into Pydantic!
pydantic_numpy.typing
provides many typings such asNpNDArrayFp64
,Np3DArrayFp64
(float64 that must be 3D)! Works with bothpydantic.BaseModel
andpydantic.dataclass
NumpyModel
(derived frompydantic.BaseModel
) make it possible to dump and loadnp.ndarray
within model fields alongside other fields that are not instances ofnp.ndarray
!
See the test.helper.groups
to see types that are defined explicitly. Define your own NumPy types with pydantic_numpy.np_array_pydantic_annotated_typing
.
For more examples see test_ndarray.py
import numpy as np
from pydantic import BaseModel
import pydantic_numpy.typing as pnd
from pydantic_numpy import np_array_pydantic_annotated_typing
from pydantic_numpy.model import NumpyModel, MultiArrayNumpyFile
class MyBaseModelDerivedModel(BaseModel):
any_array_dtype_and_dimension: pnd.NpNDArray
# Must be numpy float32 as dtype
k: np_array_pydantic_annotated_typing(data_type=np.float32)
shorthand_for_k: pnd.NpNDArrayFp32
must_be_1d_np_array: np_array_pydantic_annotated_typing(dimensions=1)
class MyDemoNumpyModel(NumpyModel):
k: np_array_pydantic_annotated_typing(data_type=np.float32)
# Instantiate from array
cfg = MyDemoModel(k=[1, 2])
# Instantiate from numpy file
cfg = MyDemoModel(k="path_to/array.npy")
# Instantiate from npz file with key
cfg = MyDemoModel(k=MultiArrayNumpyFile(path="path_to/array.npz", key="k"))
cfg.k # np.ndarray[np.float32]
cfg.dump("path_to_dump_dir", "object_id")
cfg.load("path_to_dump_dir", "object_id")
NumpyModel.load
requires the original model:
MyNumpyModel.load(<path>)
Use model_agnostic_load
when you have several models that may be the correct model:
from pydantic_numpy.model import model_agnostic_load
cfg.dump("path_to_dump_dir", "object_id")
equals_cfg = model_agnostic_load("path_to_dump_dir", "object_id", models=[MyNumpyModel, MyDemoModel])
pip install pydantic-numpy
You can install from cheind's repository if you want Python 3.8
support, but this version only supports Pydantic V1 and will not work with V2.
As of version 3.0.0
the license has moved over to BSD-4. The versions prior are under the MIT license.
The original idea originates from this discussion, and forked from cheind's repository.