block_from_array

metatensor.block_from_array(array, sample_names: List[str] | None = None, component_names: List[str] | None = None, property_names: List[str] | None = None) TensorBlock[source]

Creates a simple TensorBlock from an array.

The metadata in the resulting TensorBlock is filled with ranges of integers. This function should be seen as a quick way of creating a TensorBlock from arbitrary data. However, the metadata generated in this way has little meaning.

Parameters:
  • array – An array with two or more dimensions. This can either be a numpy.ndarray or a torch.Tensor.

  • sample_names (List[str] | None) – A list containing d_samples names for the sample dimensions. The first d_samples dimensions in the array will be interpreted as enumerating samples. None implies a single dimension named "sample".

  • property_names (List[str] | None) – A list containing d_properties names for the property dimensions. The last d_properties dimensions in the array will be interpreted as enumerating properties. None implies a single dimension named "property".

  • component_names (List[str] | None) – A list containing n_component names for the component dimensions. The middle d_components dimensions in the array will be interpreted as enumerating components. None implies that all the middle dimensions (after removing any sample and property dimensions) will be considered components, named "component_xxx".

Returns:

A TensorBlock whose values correspond to the provided array. If no name options are provided, the metadata names are set to "sample" for samples; "component_1", "component_2", … for components; and property for properties. The number of component labels is adapted to the dimensionality of the input array. If axes names are given, as indicated in the parameter list, the dimensions of the array will be interpreted accordingly, and indices also generated in a similar way. The metadata associated with each axis is a range of integers going from 0 to the size of the corresponding axis. The returned TensorBlock has no gradients.

Return type:

TensorBlock

>>> import numpy as np
>>> import metatensor
>>> # Construct a simple 4D array:
>>> array = np.linspace(0, 10, 42).reshape((7, 3, 1, 2))
>>> # Transform it into a TensorBlock:
>>> tensor_block = metatensor.block_from_array(array)
>>> print(tensor_block)
TensorBlock
    samples (7): ['sample']
    components (3, 1): ['component_1', 'component_2']
    properties (2): ['property']
    gradients: None
>>> # The data inside the TensorBlock will correspond to the provided array:
>>> print(np.all(array == tensor_block.values))
True
>>> # High-dimensional tensor
>>> array = np.linspace(0, 10, 60).reshape((2, 3, 5, 1, 2))
>>> # Specify axes names:
>>> tensor_block = metatensor.block_from_array(
...     array, sample_names=["a", "b"], property_names=["y"]
... )
>>> print(tensor_block)
TensorBlock
    samples (6): ['a', 'b']
    components (5, 1): ['component_1', 'component_2']
    properties (2): ['y']
    gradients: None