4793
Comment:
|
4724
|
Deletions are marked like this. | Additions are marked like this. |
Line 11: | Line 11: |
TODO (Hannah): for dense matrices (matrix vs. array) as well as sparse matrices (csr_matrix((data, indices, indptr)) | TODO (Hannah): for dense matrices (matrix vs. array) as well as sparse matrices (csr_matrix((data, indices, indptr))) |
Line 19: | Line 19: |
TODO (Raghu): examples of dot product (dense * dense, dense * sparse, sparse * sparse), usage of both matrix.dot() and * (and how it behaves in different contexts), constant factor adding / multiplication | TODO (Raghu): examples of dot product (dense * dense, dense * sparse, sparse * sparse), usage of both matrix.dot() and *, constant factor adding / multiplication |
Line 53: | Line 53: |
Special diagonal ''m''*''m'' matrix where all elements on the main diagonal are 1. Sometimes denoted as '''1'''. Read as the '1' of matrix world. For example, a ''n''*''m'' matrix ''A'' multiplied with an ''m''*''m'' identity matrix yields ''A'' again. Use [[https://docs.scipy.org/doc/numpy/reference/generated/numpy.identity.html|numpy.identity(k)]] to create a ''k''*''k'' identity matrix. | Special diagonal ''m''*''m'' matrix where all elements on the main diagonal are 1. Read as the '1' of matrix world. For example, a ''n''*''m'' matrix ''A'' multiplied with an ''m''*''m'' identity matrix yields ''A'' again. Use [[https://docs.scipy.org/doc/numpy/reference/generated/numpy.identity.html|numpy.identity(k)]] to create a ''k''*''k'' identity matrix. |
Line 110: | Line 110: |
U: | Uk: |
Line 114: | Line 114: |
S: | Sk: |
Line 116: | Line 116: |
V: | Vk: |
numpy cheat sheet
General
TODO (?)
Matrix construction
TODO (Hannah): for dense matrices (matrix vs. array) as well as sparse matrices (csr_matrix((data, indices, indptr)))
Accessing elements
TODO (Hannah): crazy element access magic, single elements, entire rows, sub-matrices
Matrix operations
TODO (Raghu): examples of dot product (dense * dense, dense * sparse, sparse * sparse), usage of both matrix.dot() and *, constant factor adding / multiplication
TODO (Claudius): Element-wise operations like taking log, sqrt. Multiplying two m*n matrices element-wise (for example, to square the entries in a matrix etc...)
Row- or column-wise operations
TODO (Claudius): summing of rows or columns, sorting rows / columns etc
Useful methods
TODO (Natalie): numpy.where, numpy.argsort, numpy.min, numpy.argmin, numpy.round (useful for tests), ...
Special matrices
Diagonal matrix
Matrix (usually square) in which all entries are zero, except on the main diagonal. Use numpy.diag to either create a diagonal matrix from a given main diagonal, or extract the diagonal matrix from a given matrix.
>>> numpy.diag([1,2,3]) array([[1, 0, 0], [0, 2, 0], [0, 0, 3]])
>>> numpy.diag([[1, 5, 4], [7, 2, 4], [4, 7, 3]]) array([1, 2, 3])
For a sparse matrix, use scipy.spare.spdiags.
Identity matrix
Special diagonal m*m matrix where all elements on the main diagonal are 1. Read as the '1' of matrix world. For example, a n*m matrix A multiplied with an m*m identity matrix yields A again. Use numpy.identity(k) to create a k*k identity matrix.
>>> numpy.identity(4) array([[ 1., 0., 0., 0.], [ 0., 1., 0., 0.], [ 0., 0., 1., 0.], [ 0., 0., 0., 1.]])
>>> numpy.array([[1, 2, 3], [3, 4, 3]]).dot(numpy.identity(3)) array([[ 1., 2., 3.], [ 3., 4., 3.]])
For a sparse matrix, use scipy.sparse.identity.
Triangular matrix
A (square) matrix where all elements below (upper triangle) or above (lower triangle) the main diagonal are zero. numpy.triu creates the upper (u), numpy.tril the lower (l) triangular matrix from a given matrix.
>>> numpy.triu([[1, 5, 4], [7, 2, 4], [4, 7, 3]]) array([[1, 5, 4], [0, 2, 4], [0, 0, 3]])
>>> numpy.tril([[1, 5, 4], [7, 2, 4], [4, 7, 3]]) array([[1, 0, 0], [7, 2, 0], [4, 7, 3]])
For a sparse matrix, use scipy.sparse.triu and scipy.sparse.tril.
Matrix decomposition
Singular Value Decompostion (SVD)
Factorize a matrix A (m*n) into three matrices U (m * r), S (r * r) and V (r * n) such that A = U * S * V. Here r is the rank of A.
Use numpy.linalg.svd to do a singular value decomposition for a dense matrix. Use scipy.sparse.linalg.svds for sparse matrices (computes the largest k singular values for a sparse matrix).
>>> Uk, Sk, Vk = svds(csr_matrix([[1, 2, 3], [3, 4, 5], [5, 6, 4]], dtype=float), 2) >>> print("Uk:\n", Uk, "\nSk:\n", Sk, "\nVk:\n", Vk) Uk: [[ 0.56475636 -0.30288472] [ 0.51457155 -0.59799935] [-0.64518709 -0.74206309]] Sk: [ 2.13530566 11.67829513] Vk: [[-0.52332762 -0.32001209 0.78975975] [-0.49726421 -0.63794803 -0.58800563]]