sfepy.linalg.utils module

class sfepy.linalg.utils.MatrixAction(**kwargs)[source]
static from_array(arr)[source]
static from_function(fun, expected_shape, dtype)[source]
sfepy.linalg.utils.apply_to_sequence(seq, fun, ndim, out_item_shape)[source]

Applies function fun() to each item of the sequence seq. An item corresponds to the last ndim dimensions of seq.


seq : array

The sequence array with shape (n_1, …, n_r, m_1, …, m_{ndim}).

fun : function

The function taking an array argument of shape of length ndim.

ndim : int

The number of dimensions of an item in seq.

out_item_shape : tuple

The shape an output item.


out : array

The resulting array of shape (n_1, …, n_r) + out_item_shape. The out_item_shape must be compatible with the fun.


Returns an index array that sorts the sequence seq. Works along rows if seq is two-dimensional.

sfepy.linalg.utils.assemble1d(ar_out, indx, ar_in)[source]

Perform ar_out[indx] += ar_in, where items of ar_in corresponding to duplicate indices in indx are summed together.


Same as cycle, but with general sequences.


In [19]: c = combine( [[‘a’, ‘x’], [‘b’, ‘c’], [‘dd’]] )

In [20]: list(c) Out[20]: [[‘a’, ‘b’, ‘dd’], [‘a’, ‘c’, ‘dd’], [‘x’, ‘b’, ‘dd’], [‘x’, ‘c’, ‘dd’]]


Cycles through all combinations of bounds, returns a generator.

More specifically, let bounds=[a, b, c, …], so cycle returns all combinations of lists [0<=i<a, 0<=j<b, 0<=k<c, …] for all i,j,k,…

Examples: In [9]: list(cycle([3, 2])) Out[9]: [[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]]

In [14]: list(cycle([3, 4])) [[0, 0], [0, 1], [0, 2], [0, 3], [1, 0], [1, 1], [1, 2], [1, 3], [2, 0], [2, 1], [2, 2], [2, 3]]


Fast determinant calculation of 3-dimensional array.


a : array

The input array with shape (m, n, n).


out : array

The output array with shape (m,): out[i] = det(a[i, :, :]).

sfepy.linalg.utils.dot_sequences(mtx, vec, mode=’AB’)[source]

Computes dot product for each pair of items in the two sequences.

Equivalent to

>>> out = nm.empty((vec.shape[0], mtx.shape[1], vec.shape[2]),
>>>                dtype=vec.dtype)
>>> for ir in range(mtx.shape[0]):
>>>     out[ir] = nm.dot(mtx[ir], vec[ir])

mtx : array

The array of matrices with shape (n_item, m, n).

vec : array

The array of vectors with shape (n_item, a) or matrices with shape (n_item, a, b).

mode : one of ‘AB’, ‘ATB’, ‘ABT’, ‘ATBT’

The mode of the dot product - the corresponding axes are dotted together:

‘AB’ : a = n ‘ATB’ : a = m ‘ABT’ : b = n (*) ‘ATBT’ : b = m (*)

(*) The ‘BT’ part is ignored for the vector second argument.


out : array

The resulting array.


Uses numpy.core.umath_tests.matrix_multiply() if available, which is much faster than the default implementation.

The default implementation uses numpy.sum() and element-wise multiplication. For r-D arrays (n_1, …, n_r, ?, ?) the arrays are first reshaped to (n_1 * … * n_r, ?, ?), then the dot is performed, and finally the shape is restored to (n_1, …, n_r, ?, ?).

sfepy.linalg.utils.insert_strided_axis(ar, axis, length)[source]

Insert a new axis of given length into an array using numpy stride tricks, i.e. no copy is made.


ar : array

The input array.

axis : int

The axis before which the new axis will be inserted.

length : int

The length of the inserted axis.


out : array

The output array sharing data with ar.


>>> import numpy as nm
>>> from sfepy.linalg import insert_strided_axis
>>> ar = nm.random.rand(2, 1, 2)
>>> ar
array([[[ 0.18905119,  0.44552425]],
[[ 0.78593989, 0.71852473]]])
>>> ar.shape
(2, 1, 2)
>>> ar2 = insert_strided_axis(ar, 1, 3)
>>> ar2
array([[[[ 0.18905119,  0.44552425]],

[[ 0.18905119, 0.44552425]],

[[ 0.18905119, 0.44552425]]],

[[[ 0.78593989, 0.71852473]],

[[ 0.78593989, 0.71852473]],

[[ 0.78593989, 0.71852473]]]])

>>> ar2.shape
(2, 3, 1, 2)
sfepy.linalg.utils.map_permutations(seq1, seq2, check_same_items=False)[source]

Returns an index array imap such that seq1[imap] == seq2, if both sequences have the same items - this is not checked by default!

In other words, finds the indices of items of seq2 in seq1.

sfepy.linalg.utils.mini_newton(fun, x0, dfun, i_max=100, eps=1e-08)[source]
sfepy.linalg.utils.norm_l2_along_axis(ar, axis=1, n_item=None, squared=False)[source]

Compute l2 norm of rows (axis=1) or columns (axis=0) of a 2D array.

n_item … use only the first n_item columns/rows squared … if True, return the norm squared

sfepy.linalg.utils.normalize_vectors(vecs, eps=1e-08)[source]

Normalize an array of vectors in place.


vecs : array

The 2D array of vectors in rows.

eps : float

The tolerance for considering a vector to have zero norm. Such vectors are left unchanged.

sfepy.linalg.utils.output_array_stats(ar, name, verbose=True)[source]

Print array shape and other basic information.

sfepy.linalg.utils.split_range(n_item, step)[source]
sfepy.linalg.utils.unique_rows(ar, return_index=False, return_inverse=False)[source]

Return unique rows of a two-dimensional array ar. The arguments follow numpy.unique().