Source code for mrfmsim.formula.math
"""Mathematical operations for the MRFM simulation."""
import numpy as np
[docs]
def slice_matrix(matrix, shape):
"""Slice numpy matrix.
The function only slices the matrix in the middle based on the shape.
The resulting array should be a view of the original array,
which provides memory and speed improvement.
:param ndarray matrix: a numpy array.
:param tuple shape: sliced shape, has the same dimension as the matrix.
The shape along the sliced axis should be the same oddity as the matrix.
"""
oshape = np.array(matrix.shape)
shape = np.array(shape)
index_i = ((oshape - shape) / 2).astype(int)
index_f = index_i + shape
slice_index = []
for i in range(shape.size):
slice_index.append(slice(index_i[i], index_f[i]))
return matrix[tuple(slice_index)]
[docs]
def as_strided_x(dataset, window):
"""Function for adjusting the stride size in the x direction.
The operation is very fast and does not require extra memory because it
only defines the stride size rather than creating a new array
For a dataset with a shape of (6, 5, 4) with a window of 3 in the x direction,
the resulting array shape is (4, 5, 4). The two new parameters are
(4, 6, 5, 4), stride is (160, 160, 32, 8) if each element is 2 bytes
For example, to determine the max value of a 3-dimensional array for every
3 elements in x direction::
dataset_strided = strided_axis0(dataset, 3)
dataset_strided.max(axis = 1)
For more information, see `as_strided <https://docs.scipy.org/doc/numpy/
reference/generated/numpy.lib.stride_tricks.as_strided.html
#numpy.lib.stride_tricks.as_strided>`_ and `numpy arrays memory and strides
<https://www.jessicayung.com/numpy-arrays-memory-and-strides/>`_.
:param array dataset: the dataset target to determine max and min
(or other running operations)
:param int window: the size of a sliding window for the dataset
:return: strided dataset
:rtype: ndarray
"""
new = (dataset.shape[0] - window + 1, window) + dataset.shape[1:]
strides = (dataset.strides[0],) + dataset.strides
return np.lib.stride_tricks.as_strided(
dataset, shape=new, strides=strides, writeable=False
)