# Multi-dimensional array API

See Multidimensional Raster Data Model and Multidimensional raster API tutorial for examples of working with the Multi-dimensional array API.

## Group

class osgeo.gdal.Group(*args, **kwargs)

  Proxy of C++ GDALGroupHS class.

  CreateAttribute(Group self, char const * name, int dimensions, ExtendedDataType data_type, char ** options=None) → Attribute

    Create an attribute within a `MDArray` or `Group`.

    See `GDALIHasAttribute::CreateAttribute()`.

    Parameters:

      - name (str) -- name

      - dimensions (list) -- List of dimensions, ordered from the slowest varying dimension first to the fastest varying dimension last. Might be empty for a scalar array (if supported by driver)

      - data_type (`ExtendedDataType`) -- Attribute data type

      - options (dict or list, optional) -- dict or list of driver specific `NAME=VALUE` option strings.

    Returns:

      the new `Attribute` or `None` on failure.

    Return type:

      Attribute

    Examples

        >>> drv = gdal.GetDriverByName('MEM')
        >>> mem_ds = drv.CreateMultiDimensional('myds')
        >>> rg = mem_ds.GetRootGroup()
        >>> dim = rg.CreateDimension('dim', None, None, 2)
        >>> ar = rg.CreateMDArray('ar_double', [dim], gdal.ExtendedDataType.Create(gdal.GDT_Float64))
        >>> numeric_attr = ar.CreateAttribute('numeric_attr', [], gdal.ExtendedDataType.Create(gdal.GDT_Float64))
        >>> string_attr = ar.CreateAttribute('string_attr', [], gdal.ExtendedDataType.CreateString())

  CreateDimension(Group self, char const * name, char const * dim_type, char const * direction, GUIntBig size, char ** options=None) → Dimension

    Create a dimension within a `Group`.

    See `GDALGroup::CreateDimension()`.

    Parameters:

      - name (str) -- Dimension name

      - dim_type (str) -- Dimension type (might be empty, and ignored by drivers)

      - direction (str) -- Dimension direction (might be empty, and ignored by drivers)

      - size (int) -- Number of values indexed by this dimension. Should be > 0

      - options (dict or list, optional) -- dict or list of driver specific `NAME=VALUE` option strings.

    Returns:

      the new `Dimension` or `None` on failure.

    Return type:

      Dimension

    Examples

        >>> drv = gdal.GetDriverByName('MEM')
        >>> mem_ds = drv.CreateMultiDimensional('myds')
        >>> rg = mem_ds.GetRootGroup()
        >>> dim_band = rg.CreateDimension('band', None, None, 3)
        >>> dim_x = rg.CreateDimension('X', None, None, 2)
        >>> dim_x.GetFullName()
        '/X'
        >>> lat = rg.CreateDimension('latitude', gdal.DIM_TYPE_HORIZONTAL_X, None, 2)
        >>> lat.GetType()
        'HORIZONTAL_X'

  CreateGroup(Group self, char const * name, char ** options=None) → Group
  CreateMDArray(Group self, char const * name, int dimensions, ExtendedDataType data_type, char ** options=None) → MDArray

    Create a multidimensional array within a group.

    It is recommended that the GDALDimension objects passed in `dimensions` belong to this group, either by retrieving them with `GetDimensions()` or creating a new one with `CreateDimension()`.

    See `GDALGroup::CreateMDArray()`.

    Parameters:

      - name (str) -- name

      - dimensions (list) -- List of dimensions, ordered from the slowest varying dimension first to the fastest varying dimension last. Might be empty for a scalar array (if supported by driver)

      - data_type (`ExtendedDataType`) -- Array data type

      - options (dict or list, optional) -- dict or list of driver specific `NAME=VALUE` option strings.

    Returns:

      the new `MDArray` or `None` on failure.

    Return type:

      MDArray

    Examples

        >>> drv = gdal.GetDriverByName('MEM')
        >>> mem_ds = drv.CreateMultiDimensional('myds')
        >>> rg = mem_ds.GetRootGroup()
        >>> dimX = rg.CreateDimension('X', None, None, 3)
        >>> ar = rg.CreateMDArray('ar', [dimX], gdal.ExtendedDataType.Create(gdal.GDT_Byte))

  DeleteAttribute(Group self, char const * name, char ** options=None) → CPLErr
  DeleteGroup(Group self, char const * name, char ** options=None) → CPLErr
  DeleteMDArray(Group self, char const * name, char ** options=None) → CPLErr
  GetAttribute(Group self, char const * name) → Attribute
  GetAttributes(Group self, char ** options=None)
  GetDataType(Group self, size_t idx) → ExtendedDataType
  GetDataTypeCount(Group self) → size_t
  GetDataTypes()

    Return data types associated with that group (typically enumerations)

  GetDimensions(Group self, char ** options=None)
  GetFullName(Group self) → char const *
  GetGroupNames(options=[]) → list[str]
  GetMDArrayFullNamesRecursive(Group self, char ** groupOptions=None, char ** arrayOptions=None) → char **
  GetMDArrayNames(options=[]) → list[str]
  GetName(Group self) → char const *
  GetStructuralInfo(Group self) → char **
  GetVectorLayerNames(Group self, char ** options=None) → char **
  OpenGroup(Group self, char const * name, char ** options=None) → Group
  OpenGroupFromFullname(Group self, char const * name, char ** options=None) → Group
  OpenMDArray(Group self, char const * name, char ** options=None) → MDArray
  OpenMDArrayFromFullname(Group self, char const * name, char ** options=None) → MDArray
  OpenVectorLayer(Group self, char const * name, char ** options=None) → Layer
  Rename(Group self, char const * newName) → CPLErr
  ResolveMDArray(Group self, char const * name, char const * starting_point, char ** options=None) → MDArray
  SubsetDimensionFromSelection(Group self, char const * selection, char ** options=None) → Group

## Dimension

class osgeo.gdal.Dimension(*args, **kwargs)

  Proxy of C++ GDALDimensionHS class.

  GetDirection(Dimension self) → char const *
  GetFullName(Dimension self) → char const *
  GetIndexingVariable(Dimension self) → MDArray
  GetName(Dimension self) → char const *
  GetSize(Dimension self) → GUIntBig
  GetType(Dimension self) → char const *
  Rename(Dimension self, char const * newName) → CPLErr
  SetIndexingVariable(Dimension self, MDArray array) → bool

## MDArray

class osgeo.gdal.MDArray(*args, **kwargs)

  Proxy of C++ GDALMDArrayHS class.

  AdviseRead(array_start_idx=None, count=None, options=[])
  AsClassicDataset(MDArray self, size_t iXDim, size_t iYDim, Group hRootGroup=None, char ** options=None) → Dataset
  Cache(MDArray self, char ** options=None) → bool
  ComputeStatistics(MDArray self, bool approx_ok=FALSE, GDALProgressFunc callback=0, void * callback_data=None, char ** options=None) → Statistics
  CreateAttribute(MDArray self, char const * name, int dimensions, ExtendedDataType data_type, char ** options=None) → Attribute

    Create an attribute within a `MDArray` or `Group`.

    See `GDALIHasAttribute::CreateAttribute()`.

    Parameters:

      - name (str) -- name

      - dimensions (list) -- List of dimensions, ordered from the slowest varying dimension first to the fastest varying dimension last. Might be empty for a scalar array (if supported by driver)

      - data_type (`ExtendedDataType`) -- Attribute data type

      - options (dict or list, optional) -- dict or list of driver specific `NAME=VALUE` option strings.

    Returns:

      the new `Attribute` or `None` on failure.

    Return type:

      Attribute

    Examples

        >>> drv = gdal.GetDriverByName('MEM')
        >>> mem_ds = drv.CreateMultiDimensional('myds')
        >>> rg = mem_ds.GetRootGroup()
        >>> dim = rg.CreateDimension('dim', None, None, 2)
        >>> ar = rg.CreateMDArray('ar_double', [dim], gdal.ExtendedDataType.Create(gdal.GDT_Float64))
        >>> numeric_attr = ar.CreateAttribute('numeric_attr', [], gdal.ExtendedDataType.Create(gdal.GDT_Float64))
        >>> string_attr = ar.CreateAttribute('string_attr', [], gdal.ExtendedDataType.CreateString())

  DeleteAttribute(MDArray self, char const * name, char ** options=None) → CPLErr
  DeleteNoDataValue(MDArray self) → CPLErr
  GetAttribute(MDArray self, char const * name) → Attribute
  GetAttributes(MDArray self, char ** options=None)
  GetBlockSize(MDArray self)
  GetCoordinateVariables(MDArray self)
  GetDataType(MDArray self) → ExtendedDataType
  GetDimensionCount(MDArray self) → size_t
  GetDimensions(MDArray self)
  GetFullName(MDArray self) → char const *
  GetGridded(MDArray self, char const * pszGridOptions, MDArray xArray=None, MDArray yArray=None, char ** options=None) → MDArray
  GetMask(MDArray self, char ** options=None) → MDArray
  static GetMeshGrid(int nInputArrays, char ** options=None)
  GetName(MDArray self) → char const *
  GetNoDataValue(MDArray self) → value
  GetNoDataValueAsDouble(MDArray self)
  GetNoDataValueAsInt64(MDArray self)
  GetNoDataValueAsRaw(MDArray self) → CPLErr
  GetNoDataValueAsString(MDArray self) → retStringAndCPLFree *
  GetNoDataValueAsUInt64(MDArray self)
  GetOffset(MDArray self)
  GetOffsetStorageType(MDArray self) → GDALDataType
  GetProcessingChunkSize(MDArray self, size_t nMaxChunkMemory)
  GetRawBlockInfo(MDArray self, int nDims) → RawBlockInfo
  GetResampled(MDArray self, int nDimensions, GDALRIOResampleAlg resample_alg, OSRSpatialReferenceShadow ** srs, char ** options=None) → MDArray
  GetScale(MDArray self)
  GetScaleStorageType(MDArray self) → GDALDataType
  GetShape()

    Return the shape of the array

  GetSpatialRef(MDArray self) → SpatialReference
  GetStatistics(MDArray self, bool approx_ok=FALSE, bool force=TRUE, GDALProgressFunc callback=0, void * callback_data=None) → Statistics
  GetStructuralInfo(MDArray self) → char **
  GetTotalElementsCount(MDArray self) → GUIntBig
  GetUnit(MDArray self) → char const *
  GetUnscaled(MDArray self) → MDArray
  GetView(MDArray self, char const * viewExpr) → MDArray
  Read(array_start_idx=None, count=None, array_step=None, buffer_stride=None, buffer_datatype=None)
  ReadAsArray(array_start_idx=None, count=None, array_step=None, buffer_datatype=None, buf_obj=None)
  ReadAsMaskedArray(array_start_idx=None, count=None, array_step=None)

    Return a numpy masked array of ReadAsArray() with GetMask()

  Rename(MDArray self, char const * newName) → CPLErr
  Resize(MDArray self, int newDimensions, char ** options=None) → CPLErr
  SetNoDataValue(MDArray self, value) → CPLErr
  SetNoDataValueDouble(MDArray self, double d) → CPLErr
  SetNoDataValueInt64(MDArray self, GIntBig v) → CPLErr
  SetNoDataValueRaw(MDArray self, GIntBig nLen) → CPLErr
  SetNoDataValueString(MDArray self, char const * nodata) → CPLErr
  SetNoDataValueUInt64(MDArray self, GUIntBig v) → CPLErr
  SetOffset(MDArray self, double val, GDALDataType storageType=GDT_Unknown) → CPLErr
  SetScale(MDArray self, double val, GDALDataType storageType=GDT_Unknown) → CPLErr
  SetSpatialRef(MDArray self, SpatialReference srs) → OGRErr
  SetUnit(MDArray self, char const * unit) → CPLErr
  Transpose(MDArray self, int axisMap) → MDArray
  Write(buffer, array_start_idx=None, count=None, array_step=None, buffer_stride=None, buffer_datatype=None)
  WriteArray(array, array_start_idx=None, array_step=None)
  WriteStringArray(MDArray self, int nDims1, int nDims2, int nDims3, ExtendedDataType buffer_datatype, char ** options) → CPLErr
  property shape

    Returns the shape of the array.

## Attribute

class osgeo.gdal.Attribute(*args, **kwargs)

  Proxy of C++ GDALAttributeHS class.

  GetDataType(Attribute self) → ExtendedDataType
  GetDimensionCount(Attribute self) → size_t
  GetDimensionsSize(Attribute self)
  GetFullName(Attribute self) → char const *
  GetName(Attribute self) → char const *
  GetTotalElementsCount(Attribute self) → GUIntBig
  Read()

    Read an attribute and return it with the most appropriate type

  ReadAsDouble(Attribute self) → double
  ReadAsDoubleArray(Attribute self)
  ReadAsInt(Attribute self) → int
  ReadAsInt64(Attribute self) → long long
  ReadAsInt64Array(Attribute self)
  ReadAsIntArray(Attribute self)
  ReadAsRaw(Attribute self) → CPLErr
  ReadAsString(Attribute self) → char const *
  ReadAsStringArray(Attribute self) → char **
  Rename(Attribute self, char const * newName) → CPLErr
  Write(val)
  WriteDouble(Attribute self, double val) → CPLErr
  WriteDoubleArray(Attribute self, int nList) → CPLErr
  WriteInt(Attribute self, int val) → CPLErr
  WriteInt64(Attribute self, long long val) → CPLErr
  WriteInt64Array(Attribute self, int nList) → CPLErr
  WriteIntArray(Attribute self, int nList) → CPLErr
  WriteRaw(Attribute self, GIntBig nLen) → CPLErr
  WriteString(Attribute self, char const * val) → CPLErr
  WriteStringArray(Attribute self, char ** vals) → CPLErr

## ExtendedDataType

class osgeo.gdal.ExtendedDataType(*args, **kwargs)

  Proxy of C++ GDALExtendedDataTypeHS class.

  CanConvertTo(ExtendedDataType self, ExtendedDataType other) → bool
  static Create(GDALDataType dt) → ExtendedDataType
  static CreateCompound(char const * name, size_t nTotalSize, int nComps) → ExtendedDataType
  static CreateString(size_t nMaxStringLength=0, GDALExtendedDataTypeSubType eSubType=GEDTST_NONE) → ExtendedDataType
  Equals(ExtendedDataType self, ExtendedDataType other) → bool
  GetClass(ExtendedDataType self) → GDALExtendedDataTypeClass
  GetComponents(ExtendedDataType self)
  GetMaxStringLength(ExtendedDataType self) → size_t
  GetName(ExtendedDataType self) → char const *
  GetNumericDataType(ExtendedDataType self) → GDALDataType
  GetRAT(ExtendedDataType self) → RasterAttributeTable
  GetSize(ExtendedDataType self) → size_t
  GetSubType(ExtendedDataType self) → GDALExtendedDataTypeSubType