跳到内容

对角化

将 COO 数组对角化。新维度追加在末尾。

警告

sparse.diagonalize 不兼容 numpy,因为 NumPy 没有直接的等效项。API 在未来可能会发生变化。

参数

名称 类型 描述 默认值
a Union[COO, ndarray, spmatrix]

要对角化的数组。

必需
axis int

要对角化的轴。默认为第一个轴(0)。

0

示例

>>> import sparse
>>> x = sparse.as_coo(np.arange(1, 4))
>>> sparse.diagonalize(x).todense()
array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])
>>> x = sparse.as_coo(np.arange(24).reshape((2, 3, 4)))
>>> x_diag = sparse.diagonalize(x, axis=1)
>>> x_diag.shape
(2, 3, 4, 3)

sparse.diagonalizesparse.diagonal 的逆操作。

>>> a = sparse.random((3, 3, 3, 3, 3), density=0.3)
>>> a_diag = sparse.diagonalize(a, axis=2)
>>> (sparse.diagonal(a_diag, axis1=2, axis2=5) == a.transpose([0, 1, 3, 4, 2])).all()
np.True_

返回值

名称 类型 描述
out COO

操作的结果。

另请参阅

numpy.diag : 一维数组的 NumPy 等效项

源代码位于 sparse/numba_backend/_coo/common.py
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
def diagonalize(a, axis=0):
    """
    Diagonalize a COO array. The new dimension is appended at the end.

    !!! warning

        [`sparse.diagonalize`][] is not [numpy][] compatible as there is no direct [numpy][] equivalent. The
        API may change in the future.

    Parameters
    ----------
    a : Union[COO, np.ndarray, scipy.sparse.spmatrix]
        The array to diagonalize.
    axis : int, optional
        The axis to diagonalize. Defaults to first axis (0).

    Examples
    --------
    >>> import sparse
    >>> x = sparse.as_coo(np.arange(1, 4))
    >>> sparse.diagonalize(x).todense()
    array([[1, 0, 0],
           [0, 2, 0],
           [0, 0, 3]])

    >>> x = sparse.as_coo(np.arange(24).reshape((2, 3, 4)))
    >>> x_diag = sparse.diagonalize(x, axis=1)
    >>> x_diag.shape
    (2, 3, 4, 3)

    [`sparse.diagonalize`][] is the inverse of [`sparse.diagonal`][]

    >>> a = sparse.random((3, 3, 3, 3, 3), density=0.3)
    >>> a_diag = sparse.diagonalize(a, axis=2)
    >>> (sparse.diagonal(a_diag, axis1=2, axis2=5) == a.transpose([0, 1, 3, 4, 2])).all()
    np.True_

    Returns
    -------
    out: COO
        The result of the operation.

    See Also
    --------
    [`numpy.diag`][] : NumPy equivalent for 1D array
    """
    from .core import COO, as_coo

    a = as_coo(a)

    diag_shape = a.shape + (a.shape[axis],)
    diag_coords = np.vstack([a.coords, a.coords[axis]])

    return COO(diag_coords, a.data, diag_shape)