Hacking Math I

drawing

Matrix Inverses and Numpy

This topic:

  1. Intro to Numpy and Scipy
  2. Inverse varieties and approaches
  3. Inverses and QR
  4. Polynomial interpolation
  5. Pseudo-inverses

Reading:

I. Intro to Numpy and SciPy

Leading Python tools:

  1. Jupyter - "notebooks" for inline code + LaTex math + markup, etc.

  2. NumPy - low-level array & matrix handling and algorithms

  3. SciPy - higher level numerical algorithms (still fairly basic)

  4. Matplotlib - matlab-style plotting & image display

  5. SkLearn - (Scikit-learn) Machine Learning library

NumPy

  • Numerical algorithm toolbox
  • Similar to Matlab but with key differences, such as zero-based indexing (like C) instead of one-based (like math texts). Also Julia.
  • Uses optimized linear algebra libraries called BLAS/LAPACK typically
  • NumPy Arrays - special data structure which allows direct and efficient linear algebra manipulations (basically a list with added functionality).
  • Used/extended in Tensorflow, Keras, pyTorch, Dask, ...
In [6]:
import numpy as np

x = np.array([[2,0,1,8],[1,2,3,4]])

print(x)
[[2 0 1 8]
 [1 2 3 4]]

NumPy for Matlab Users

drawing
In [4]:
help(np.array)
Help on built-in function array in module numpy.core.multiarray:

array(...)
    array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
    
    Create an array.
    
    Parameters
    ----------
    object : array_like
        An array, any object exposing the array interface, an object whose
        __array__ method returns an array, or any (nested) sequence.
    dtype : data-type, optional
        The desired data-type for the array.  If not given, then the type will
        be determined as the minimum type required to hold the objects in the
        sequence.  This argument can only be used to 'upcast' the array.  For
        downcasting, use the .astype(t) method.
    copy : bool, optional
        If true (default), then the object is copied.  Otherwise, a copy will
        only be made if __array__ returns a copy, if obj is a nested sequence,
        or if a copy is needed to satisfy any of the other requirements
        (`dtype`, `order`, etc.).
    order : {'K', 'A', 'C', 'F'}, optional
        Specify the memory layout of the array. If object is not an array, the
        newly created array will be in C order (row major) unless 'F' is
        specified, in which case it will be in Fortran order (column major).
        If object is an array the following holds.
    
        ===== ========= ===================================================
        order  no copy                     copy=True
        ===== ========= ===================================================
        'K'   unchanged F & C order preserved, otherwise most similar order
        'A'   unchanged F order if input is F and not C, otherwise C order
        'C'   C order   C order
        'F'   F order   F order
        ===== ========= ===================================================
    
        When ``copy=False`` and a copy is made for other reasons, the result is
        the same as if ``copy=True``, with some exceptions for `A`, see the
        Notes section. The default order is 'K'.
    subok : bool, optional
        If True, then sub-classes will be passed-through, otherwise
        the returned array will be forced to be a base-class array (default).
    ndmin : int, optional
        Specifies the minimum number of dimensions that the resulting
        array should have.  Ones will be pre-pended to the shape as
        needed to meet this requirement.
    
    Returns
    -------
    out : ndarray
        An array object satisfying the specified requirements.
    
    See Also
    --------
    empty, empty_like, zeros, zeros_like, ones, ones_like, full, full_like
    
    Notes
    -----
    When order is 'A' and `object` is an array in neither 'C' nor 'F' order,
    and a copy is forced by a change in dtype, then the order of the result is
    not necessarily 'C' as expected. This is likely a bug.
    
    Examples
    --------
    >>> np.array([1, 2, 3])
    array([1, 2, 3])
    
    Upcasting:
    
    >>> np.array([1, 2, 3.0])
    array([ 1.,  2.,  3.])
    
    More than one dimension:
    
    >>> np.array([[1, 2], [3, 4]])
    array([[1, 2],
           [3, 4]])
    
    Minimum dimensions 2:
    
    >>> np.array([1, 2, 3], ndmin=2)
    array([[1, 2, 3]])
    
    Type provided:
    
    >>> np.array([1, 2, 3], dtype=complex)
    array([ 1.+0.j,  2.+0.j,  3.+0.j])
    
    Data-type consisting of more than one element:
    
    >>> x = np.array([(1,2),(3,4)],dtype=[('a','<i4'),('b','<i4')])
    >>> x['a']
    array([1, 3])
    
    Creating an array from sub-classes:
    
    >>> np.array(np.mat('1 2; 3 4'))
    array([[1, 2],
           [3, 4]])
    
    >>> np.array(np.mat('1 2; 3 4'), subok=True)
    matrix([[1, 2],
            [3, 4]])

"Vectorization"

Converting loops into linear algebra functions where loop is performed at lower level

E.g. instead of looping over a list to compute squares of elements, make into array and "square" array

In [7]:
v = [1,2,3,4,5]

v2 = []
for v_k in v:
    v2.append(v_k**2)
v2
Out[7]:
[1, 4, 9, 16, 25]
In [16]:
np.array(v)*2
Out[16]:
array([ 2,  4,  6,  8, 10])
In [11]:
np.array(v)**2
Out[11]:
array([ 1,  4,  9, 16, 25], dtype=int32)
In [12]:
v+v2
Out[12]:
[1, 2, 3, 4, 5, 1, 4, 9, 16, 25]
In [13]:
np.array(v)+np.array(v2)
Out[13]:
array([ 2,  6, 12, 20, 30])

Matrix multiplication

multiplication of numpy arrays is elementwise by default

In [24]:
a = np.array([1,2,3])
b = np.array([3,3,3])
a*b
Out[24]:
array([3, 6, 9])
In [21]:
A = np.array([[1,2,3],[4,5,6]])
b = np.array([3,3,3])
A*b
Out[21]:
array([[ 3,  6,  9],
       [12, 15, 18]])
In [22]:
A@b
Out[22]:
array([18, 45])
In [25]:
np.matmul(A,b)
Out[25]:
array([18, 45])
In [30]:
np.dot(A,b)
Out[30]:
array([18, 45])
In [31]:
np.dot(A,A.T) # transpose also A.transpose()
Out[31]:
array([[14, 32],
       [32, 77]])

Fast Numerical Mathematics

In [32]:
l = range(1234)
[i ** 2 for i in l]
Out[32]:
[0,
 1,
 4,
 9,
 16,
 25,
 36,
 49,
 64,
 81,
 100,
 121,
 144,
 169,
 196,
 225,
 256,
 289,
 324,
 361,
 400,
 441,
 484,
 529,
 576,
 625,
 676,
 729,
 784,
 841,
 900,
 961,
 1024,
 1089,
 1156,
 1225,
 1296,
 1369,
 1444,
 1521,
 1600,
 1681,
 1764,
 1849,
 1936,
 2025,
 2116,
 2209,
 2304,
 2401,
 2500,
 2601,
 2704,
 2809,
 2916,
 3025,
 3136,
 3249,
 3364,
 3481,
 3600,
 3721,
 3844,
 3969,
 4096,
 4225,
 4356,
 4489,
 4624,
 4761,
 4900,
 5041,
 5184,
 5329,
 5476,
 5625,
 5776,
 5929,
 6084,
 6241,
 6400,
 6561,
 6724,
 6889,
 7056,
 7225,
 7396,
 7569,
 7744,
 7921,
 8100,
 8281,
 8464,
 8649,
 8836,
 9025,
 9216,
 9409,
 9604,
 9801,
 10000,
 10201,
 10404,
 10609,
 10816,
 11025,
 11236,
 11449,
 11664,
 11881,
 12100,
 12321,
 12544,
 12769,
 12996,
 13225,
 13456,
 13689,
 13924,
 14161,
 14400,
 14641,
 14884,
 15129,
 15376,
 15625,
 15876,
 16129,
 16384,
 16641,
 16900,
 17161,
 17424,
 17689,
 17956,
 18225,
 18496,
 18769,
 19044,
 19321,
 19600,
 19881,
 20164,
 20449,
 20736,
 21025,
 21316,
 21609,
 21904,
 22201,
 22500,
 22801,
 23104,
 23409,
 23716,
 24025,
 24336,
 24649,
 24964,
 25281,
 25600,
 25921,
 26244,
 26569,
 26896,
 27225,
 27556,
 27889,
 28224,
 28561,
 28900,
 29241,
 29584,
 29929,
 30276,
 30625,
 30976,
 31329,
 31684,
 32041,
 32400,
 32761,
 33124,
 33489,
 33856,
 34225,
 34596,
 34969,
 35344,
 35721,
 36100,
 36481,
 36864,
 37249,
 37636,
 38025,
 38416,
 38809,
 39204,
 39601,
 40000,
 40401,
 40804,
 41209,
 41616,
 42025,
 42436,
 42849,
 43264,
 43681,
 44100,
 44521,
 44944,
 45369,
 45796,
 46225,
 46656,
 47089,
 47524,
 47961,
 48400,
 48841,
 49284,
 49729,
 50176,
 50625,
 51076,
 51529,
 51984,
 52441,
 52900,
 53361,
 53824,
 54289,
 54756,
 55225,
 55696,
 56169,
 56644,
 57121,
 57600,
 58081,
 58564,
 59049,
 59536,
 60025,
 60516,
 61009,
 61504,
 62001,
 62500,
 63001,
 63504,
 64009,
 64516,
 65025,
 65536,
 66049,
 66564,
 67081,
 67600,
 68121,
 68644,
 69169,
 69696,
 70225,
 70756,
 71289,
 71824,
 72361,
 72900,
 73441,
 73984,
 74529,
 75076,
 75625,
 76176,
 76729,
 77284,
 77841,
 78400,
 78961,
 79524,
 80089,
 80656,
 81225,
 81796,
 82369,
 82944,
 83521,
 84100,
 84681,
 85264,
 85849,
 86436,
 87025,
 87616,
 88209,
 88804,
 89401,
 90000,
 90601,
 91204,
 91809,
 92416,
 93025,
 93636,
 94249,
 94864,
 95481,
 96100,
 96721,
 97344,
 97969,
 98596,
 99225,
 99856,
 100489,
 101124,
 101761,
 102400,
 103041,
 103684,
 104329,
 104976,
 105625,
 106276,
 106929,
 107584,
 108241,
 108900,
 109561,
 110224,
 110889,
 111556,
 112225,
 112896,
 113569,
 114244,
 114921,
 115600,
 116281,
 116964,
 117649,
 118336,
 119025,
 119716,
 120409,
 121104,
 121801,
 122500,
 123201,
 123904,
 124609,
 125316,
 126025,
 126736,
 127449,
 128164,
 128881,
 129600,
 130321,
 131044,
 131769,
 132496,
 133225,
 133956,
 134689,
 135424,
 136161,
 136900,
 137641,
 138384,
 139129,
 139876,
 140625,
 141376,
 142129,
 142884,
 143641,
 144400,
 145161,
 145924,
 146689,
 147456,
 148225,
 148996,
 149769,
 150544,
 151321,
 152100,
 152881,
 153664,
 154449,
 155236,
 156025,
 156816,
 157609,
 158404,
 159201,
 160000,
 160801,
 161604,
 162409,
 163216,
 164025,
 164836,
 165649,
 166464,
 167281,
 168100,
 168921,
 169744,
 170569,
 171396,
 172225,
 173056,
 173889,
 174724,
 175561,
 176400,
 177241,
 178084,
 178929,
 179776,
 180625,
 181476,
 182329,
 183184,
 184041,
 184900,
 185761,
 186624,
 187489,
 188356,
 189225,
 190096,
 190969,
 191844,
 192721,
 193600,
 194481,
 195364,
 196249,
 197136,
 198025,
 198916,
 199809,
 200704,
 201601,
 202500,
 203401,
 204304,
 205209,
 206116,
 207025,
 207936,
 208849,
 209764,
 210681,
 211600,
 212521,
 213444,
 214369,
 215296,
 216225,
 217156,
 218089,
 219024,
 219961,
 220900,
 221841,
 222784,
 223729,
 224676,
 225625,
 226576,
 227529,
 228484,
 229441,
 230400,
 231361,
 232324,
 233289,
 234256,
 235225,
 236196,
 237169,
 238144,
 239121,
 240100,
 241081,
 242064,
 243049,
 244036,
 245025,
 246016,
 247009,
 248004,
 249001,
 250000,
 251001,
 252004,
 253009,
 254016,
 255025,
 256036,
 257049,
 258064,
 259081,
 260100,
 261121,
 262144,
 263169,
 264196,
 265225,
 266256,
 267289,
 268324,
 269361,
 270400,
 271441,
 272484,
 273529,
 274576,
 275625,
 276676,
 277729,
 278784,
 279841,
 280900,
 281961,
 283024,
 284089,
 285156,
 286225,
 287296,
 288369,
 289444,
 290521,
 291600,
 292681,
 293764,
 294849,
 295936,
 297025,
 298116,
 299209,
 300304,
 301401,
 302500,
 303601,
 304704,
 305809,
 306916,
 308025,
 309136,
 310249,
 311364,
 312481,
 313600,
 314721,
 315844,
 316969,
 318096,
 319225,
 320356,
 321489,
 322624,
 323761,
 324900,
 326041,
 327184,
 328329,
 329476,
 330625,
 331776,
 332929,
 334084,
 335241,
 336400,
 337561,
 338724,
 339889,
 341056,
 342225,
 343396,
 344569,
 345744,
 346921,
 348100,
 349281,
 350464,
 351649,
 352836,
 354025,
 355216,
 356409,
 357604,
 358801,
 360000,
 361201,
 362404,
 363609,
 364816,
 366025,
 367236,
 368449,
 369664,
 370881,
 372100,
 373321,
 374544,
 375769,
 376996,
 378225,
 379456,
 380689,
 381924,
 383161,
 384400,
 385641,
 386884,
 388129,
 389376,
 390625,
 391876,
 393129,
 394384,
 395641,
 396900,
 398161,
 399424,
 400689,
 401956,
 403225,
 404496,
 405769,
 407044,
 408321,
 409600,
 410881,
 412164,
 413449,
 414736,
 416025,
 417316,
 418609,
 419904,
 421201,
 422500,
 423801,
 425104,
 426409,
 427716,
 429025,
 430336,
 431649,
 432964,
 434281,
 435600,
 436921,
 438244,
 439569,
 440896,
 442225,
 443556,
 444889,
 446224,
 447561,
 448900,
 450241,
 451584,
 452929,
 454276,
 455625,
 456976,
 458329,
 459684,
 461041,
 462400,
 463761,
 465124,
 466489,
 467856,
 469225,
 470596,
 471969,
 473344,
 474721,
 476100,
 477481,
 478864,
 480249,
 481636,
 483025,
 484416,
 485809,
 487204,
 488601,
 490000,
 491401,
 492804,
 494209,
 495616,
 497025,
 498436,
 499849,
 501264,
 502681,
 504100,
 505521,
 506944,
 508369,
 509796,
 511225,
 512656,
 514089,
 515524,
 516961,
 518400,
 519841,
 521284,
 522729,
 524176,
 525625,
 527076,
 528529,
 529984,
 531441,
 532900,
 534361,
 535824,
 537289,
 538756,
 540225,
 541696,
 543169,
 544644,
 546121,
 547600,
 549081,
 550564,
 552049,
 553536,
 555025,
 556516,
 558009,
 559504,
 561001,
 562500,
 564001,
 565504,
 567009,
 568516,
 570025,
 571536,
 573049,
 574564,
 576081,
 577600,
 579121,
 580644,
 582169,
 583696,
 585225,
 586756,
 588289,
 589824,
 591361,
 592900,
 594441,
 595984,
 597529,
 599076,
 600625,
 602176,
 603729,
 605284,
 606841,
 608400,
 609961,
 611524,
 613089,
 614656,
 616225,
 617796,
 619369,
 620944,
 622521,
 624100,
 625681,
 627264,
 628849,
 630436,
 632025,
 633616,
 635209,
 636804,
 638401,
 640000,
 641601,
 643204,
 644809,
 646416,
 648025,
 649636,
 651249,
 652864,
 654481,
 656100,
 657721,
 659344,
 660969,
 662596,
 664225,
 665856,
 667489,
 669124,
 670761,
 672400,
 674041,
 675684,
 677329,
 678976,
 680625,
 682276,
 683929,
 685584,
 687241,
 688900,
 690561,
 692224,
 693889,
 695556,
 697225,
 698896,
 700569,
 702244,
 703921,
 705600,
 707281,
 708964,
 710649,
 712336,
 714025,
 715716,
 717409,
 719104,
 720801,
 722500,
 724201,
 725904,
 727609,
 729316,
 731025,
 732736,
 734449,
 736164,
 737881,
 739600,
 741321,
 743044,
 744769,
 746496,
 748225,
 749956,
 751689,
 753424,
 755161,
 756900,
 758641,
 760384,
 762129,
 763876,
 765625,
 767376,
 769129,
 770884,
 772641,
 774400,
 776161,
 777924,
 779689,
 781456,
 783225,
 784996,
 786769,
 788544,
 790321,
 792100,
 793881,
 795664,
 797449,
 799236,
 801025,
 802816,
 804609,
 806404,
 808201,
 810000,
 811801,
 813604,
 815409,
 817216,
 819025,
 820836,
 822649,
 824464,
 826281,
 828100,
 829921,
 831744,
 833569,
 835396,
 837225,
 839056,
 840889,
 842724,
 844561,
 846400,
 848241,
 850084,
 851929,
 853776,
 855625,
 857476,
 859329,
 861184,
 863041,
 864900,
 866761,
 868624,
 870489,
 872356,
 874225,
 876096,
 877969,
 879844,
 881721,
 883600,
 885481,
 887364,
 889249,
 891136,
 893025,
 894916,
 896809,
 898704,
 900601,
 902500,
 904401,
 906304,
 908209,
 910116,
 912025,
 913936,
 915849,
 917764,
 919681,
 921600,
 923521,
 925444,
 927369,
 929296,
 931225,
 933156,
 935089,
 937024,
 938961,
 940900,
 942841,
 944784,
 946729,
 948676,
 950625,
 952576,
 954529,
 956484,
 958441,
 960400,
 962361,
 964324,
 966289,
 968256,
 970225,
 972196,
 974169,
 976144,
 978121,
 980100,
 982081,
 984064,
 986049,
 988036,
 990025,
 992016,
 994009,
 996004,
 998001,
 ...]
In [33]:
l = range(1234)
%timeit [i ** 2 for i in l]
490 µs ± 6.35 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [34]:
a = np.arange(1234)
a ** 2
Out[34]:
array([      0,       1,       4, ..., 1515361, 1517824, 1520289],
      dtype=int32)
In [35]:
a = np.arange(1234)
%timeit a ** 2
2.07 µs ± 13.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

SciPy

Implements higher-level scientific algorithms using NumPy. Examples:

  • Integration (scipy.integrate)
  • Optimization (scipy.optimize)
  • Interpolation (scipy.interpolate)
  • Signal Processing (scipy.signal)
  • Linear Algebra (scipy.linalg)
  • Statistics (scipy.stats)
  • File IO (scipy.io)

Also uses BLAS/LAPACK

In [39]:
import scipy
In [40]:
dir(scipy)
Out[40]:
['ALLOW_THREADS',
 'AxisError',
 'BUFSIZE',
 'CLIP',
 'ComplexWarning',
 'DataSource',
 'ERR_CALL',
 'ERR_DEFAULT',
 'ERR_IGNORE',
 'ERR_LOG',
 'ERR_PRINT',
 'ERR_RAISE',
 'ERR_WARN',
 'FLOATING_POINT_SUPPORT',
 'FPE_DIVIDEBYZERO',
 'FPE_INVALID',
 'FPE_OVERFLOW',
 'FPE_UNDERFLOW',
 'False_',
 'Inf',
 'Infinity',
 'LowLevelCallable',
 'MAXDIMS',
 'MAY_SHARE_BOUNDS',
 'MAY_SHARE_EXACT',
 'MachAr',
 'ModuleDeprecationWarning',
 'NAN',
 'NINF',
 'NZERO',
 'NaN',
 'PINF',
 'PZERO',
 'RAISE',
 'RankWarning',
 'SHIFT_DIVIDEBYZERO',
 'SHIFT_INVALID',
 'SHIFT_OVERFLOW',
 'SHIFT_UNDERFLOW',
 'ScalarType',
 'TooHardError',
 'True_',
 'UFUNC_BUFSIZE_DEFAULT',
 'UFUNC_PYVALS_NAME',
 'VisibleDeprecationWarning',
 'WRAP',
 '_UFUNC_API',
 '__SCIPY_SETUP__',
 '__all__',
 '__builtins__',
 '__cached__',
 '__config__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__numpy_version__',
 '__package__',
 '__path__',
 '__spec__',
 '__version__',
 '_add_newdoc_ufunc',
 '_distributor_init',
 '_lib',
 'absolute',
 'absolute_import',
 'add',
 'add_docstring',
 'add_newdoc',
 'add_newdoc_ufunc',
 'alen',
 'all',
 'allclose',
 'alltrue',
 'amax',
 'amin',
 'angle',
 'any',
 'append',
 'apply_along_axis',
 'apply_over_axes',
 'arange',
 'arccos',
 'arccosh',
 'arcsin',
 'arcsinh',
 'arctan',
 'arctan2',
 'arctanh',
 'argmax',
 'argmin',
 'argpartition',
 'argsort',
 'argwhere',
 'around',
 'array',
 'array2string',
 'array_equal',
 'array_equiv',
 'array_repr',
 'array_split',
 'array_str',
 'asanyarray',
 'asarray',
 'asarray_chkfinite',
 'ascontiguousarray',
 'asfarray',
 'asfortranarray',
 'asmatrix',
 'asscalar',
 'atleast_1d',
 'atleast_2d',
 'atleast_3d',
 'average',
 'bartlett',
 'base_repr',
 'binary_repr',
 'bincount',
 'bitwise_and',
 'bitwise_not',
 'bitwise_or',
 'bitwise_xor',
 'blackman',
 'block',
 'bmat',
 'bool8',
 'bool_',
 'broadcast',
 'broadcast_arrays',
 'broadcast_to',
 'busday_count',
 'busday_offset',
 'busdaycalendar',
 'byte',
 'byte_bounds',
 'bytes0',
 'bytes_',
 'c_',
 'can_cast',
 'cast',
 'cbrt',
 'cdouble',
 'ceil',
 'cfloat',
 'char',
 'character',
 'chararray',
 'choose',
 'clip',
 'clongdouble',
 'clongfloat',
 'column_stack',
 'common_type',
 'compare_chararrays',
 'complex128',
 'complex64',
 'complex_',
 'complexfloating',
 'compress',
 'concatenate',
 'conj',
 'conjugate',
 'convolve',
 'copy',
 'copysign',
 'copyto',
 'corrcoef',
 'correlate',
 'cos',
 'cosh',
 'count_nonzero',
 'cov',
 'cross',
 'csingle',
 'ctypeslib',
 'cumprod',
 'cumproduct',
 'cumsum',
 'datetime64',
 'datetime_as_string',
 'datetime_data',
 'deg2rad',
 'degrees',
 'delete',
 'deprecate',
 'deprecate_with_doc',
 'diag',
 'diag_indices',
 'diag_indices_from',
 'diagflat',
 'diagonal',
 'diff',
 'digitize',
 'disp',
 'divide',
 'division',
 'divmod',
 'dot',
 'double',
 'dsplit',
 'dstack',
 'dtype',
 'e',
 'ediff1d',
 'einsum',
 'einsum_path',
 'emath',
 'empty',
 'empty_like',
 'equal',
 'errstate',
 'euler_gamma',
 'exp',
 'exp2',
 'expand_dims',
 'expm1',
 'extract',
 'eye',
 'fabs',
 'fastCopyAndTranspose',
 'fft',
 'fill_diagonal',
 'find_common_type',
 'finfo',
 'fix',
 'flatiter',
 'flatnonzero',
 'flexible',
 'flip',
 'fliplr',
 'flipud',
 'float16',
 'float32',
 'float64',
 'float_',
 'float_power',
 'floating',
 'floor',
 'floor_divide',
 'fmax',
 'fmin',
 'fmod',
 'format_float_positional',
 'format_float_scientific',
 'format_parser',
 'frexp',
 'frombuffer',
 'fromfile',
 'fromfunction',
 'fromiter',
 'frompyfunc',
 'fromregex',
 'fromstring',
 'full',
 'full_like',
 'fv',
 'gcd',
 'generic',
 'genfromtxt',
 'geomspace',
 'get_array_wrap',
 'get_include',
 'get_printoptions',
 'getbufsize',
 'geterr',
 'geterrcall',
 'geterrobj',
 'gradient',
 'greater',
 'greater_equal',
 'half',
 'hamming',
 'hanning',
 'heaviside',
 'histogram',
 'histogram2d',
 'histogram_bin_edges',
 'histogramdd',
 'hsplit',
 'hstack',
 'hypot',
 'i0',
 'identity',
 'ifft',
 'iinfo',
 'imag',
 'in1d',
 'index_exp',
 'indices',
 'inexact',
 'inf',
 'info',
 'infty',
 'inner',
 'insert',
 'int0',
 'int16',
 'int32',
 'int64',
 'int8',
 'int_',
 'int_asbuffer',
 'intc',
 'integer',
 'interp',
 'intersect1d',
 'intp',
 'invert',
 'ipmt',
 'irr',
 'is_busday',
 'isclose',
 'iscomplex',
 'iscomplexobj',
 'isfinite',
 'isfortran',
 'isin',
 'isinf',
 'isnan',
 'isnat',
 'isneginf',
 'isposinf',
 'isreal',
 'isrealobj',
 'isscalar',
 'issctype',
 'issubclass_',
 'issubdtype',
 'issubsctype',
 'iterable',
 'ix_',
 'kaiser',
 'kron',
 'lcm',
 'ldexp',
 'left_shift',
 'less',
 'less_equal',
 'lexsort',
 'linspace',
 'little_endian',
 'load',
 'loads',
 'loadtxt',
 'log',
 'log10',
 'log1p',
 'log2',
 'logaddexp',
 'logaddexp2',
 'logical_and',
 'logical_not',
 'logical_or',
 'logical_xor',
 'logn',
 'logspace',
 'long',
 'longcomplex',
 'longdouble',
 'longfloat',
 'longlong',
 'lookfor',
 'ma',
 'mafromtxt',
 'mask_indices',
 'mat',
 'math',
 'matmul',
 'matrix',
 'maximum',
 'maximum_sctype',
 'may_share_memory',
 'mean',
 'median',
 'memmap',
 'meshgrid',
 'mgrid',
 'min_scalar_type',
 'minimum',
 'mintypecode',
 'mirr',
 'mod',
 'modf',
 'moveaxis',
 'msort',
 'multiply',
 'nan',
 'nan_to_num',
 'nanargmax',
 'nanargmin',
 'nancumprod',
 'nancumsum',
 'nanmax',
 'nanmean',
 'nanmedian',
 'nanmin',
 'nanpercentile',
 'nanprod',
 'nanquantile',
 'nanstd',
 'nansum',
 'nanvar',
 'nbytes',
 'ndarray',
 'ndenumerate',
 'ndfromtxt',
 'ndim',
 'ndindex',
 'nditer',
 'negative',
 'nested_iters',
 'newaxis',
 'nextafter',
 'nonzero',
 'not_equal',
 'nper',
 'npv',
 'number',
 'obj2sctype',
 'object0',
 'object_',
 'ogrid',
 'ones',
 'ones_like',
 'outer',
 'packbits',
 'pad',
 'partition',
 'percentile',
 'pi',
 'piecewise',
 'place',
 'pmt',
 'poly',
 'poly1d',
 'polyadd',
 'polyder',
 'polydiv',
 'polyfit',
 'polyint',
 'polymul',
 'polysub',
 'polyval',
 'positive',
 'power',
 'ppmt',
 'print_function',
 'printoptions',
 'prod',
 'product',
 'promote_types',
 'ptp',
 'put',
 'put_along_axis',
 'putmask',
 'pv',
 'quantile',
 'r_',
 'rad2deg',
 'radians',
 'rand',
 'randn',
 'random',
 'rank',
 'rate',
 'ravel',
 'ravel_multi_index',
 'real',
 'real_if_close',
 'rec',
 'recarray',
 'recfromcsv',
 'recfromtxt',
 'reciprocal',
 'record',
 'remainder',
 'repeat',
 'require',
 'reshape',
 'resize',
 'result_type',
 'right_shift',
 'rint',
 'roll',
 'rollaxis',
 'roots',
 'rot90',
 'round_',
 'row_stack',
 's_',
 'safe_eval',
 'save',
 'savetxt',
 'savez',
 'savez_compressed',
 'sctype2char',
 'sctypeDict',
 'sctypeNA',
 'sctypes',
 'searchsorted',
 'select',
 'set_numeric_ops',
 'set_printoptions',
 'set_string_function',
 'setbufsize',
 'setdiff1d',
 'seterr',
 'seterrcall',
 'seterrobj',
 'setxor1d',
 'shape',
 'shares_memory',
 'short',
 'show_config',
 'show_numpy_config',
 'sign',
 'signbit',
 'signedinteger',
 'sin',
 'sinc',
 'single',
 'singlecomplex',
 'sinh',
 'size',
 'sometrue',
 'sort',
 'sort_complex',
 'source',
 'spacing',
 'split',
 'sqrt',
 'square',
 'squeeze',
 'stack',
 'std',
 'str0',
 'str_',
 'string_',
 'subtract',
 'sum',
 'swapaxes',
 'take',
 'take_along_axis',
 'tan',
 'tanh',
 'tensordot',
 'test',
 'tile',
 'timedelta64',
 'trace',
 'tracemalloc_domain',
 'transpose',
 'trapz',
 'tri',
 'tril',
 'tril_indices',
 'tril_indices_from',
 'trim_zeros',
 'triu',
 'triu_indices',
 'triu_indices_from',
 'true_divide',
 'trunc',
 'typeDict',
 'typeNA',
 'typecodes',
 'typename',
 'ubyte',
 'ufunc',
 'uint',
 'uint0',
 'uint16',
 'uint32',
 'uint64',
 'uint8',
 'uintc',
 'uintp',
 'ulonglong',
 'unicode',
 'unicode_',
 'union1d',
 'unique',
 'unpackbits',
 'unravel_index',
 'unsignedinteger',
 'unwrap',
 'ushort',
 'vander',
 'var',
 'vdot',
 'vectorize',
 'version',
 'void',
 'void0',
 'vsplit',
 'vstack',
 'where',
 'who',
 'zeros',
 'zeros_like']
In [46]:
from scipy import stats
dir(scipy.stats)
Out[46]:
['PearsonRConstantInputWarning',
 'PearsonRNearConstantInputWarning',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 '_binned_statistic',
 '_constants',
 '_continuous_distns',
 '_discrete_distns',
 '_distn_infrastructure',
 '_distr_params',
 '_hypotests',
 '_multivariate',
 '_rvs_sampling',
 '_stats',
 '_stats_mstats_common',
 '_tukeylambda_stats',
 'absolute_import',
 'alpha',
 'anderson',
 'anderson_ksamp',
 'anglit',
 'ansari',
 'arcsine',
 'argus',
 'bartlett',
 'bayes_mvs',
 'bernoulli',
 'beta',
 'betaprime',
 'binned_statistic',
 'binned_statistic_2d',
 'binned_statistic_dd',
 'binom',
 'binom_test',
 'boltzmann',
 'boxcox',
 'boxcox_llf',
 'boxcox_normmax',
 'boxcox_normplot',
 'bradford',
 'brunnermunzel',
 'burr',
 'burr12',
 'cauchy',
 'chi',
 'chi2',
 'chi2_contingency',
 'chisquare',
 'circmean',
 'circstd',
 'circvar',
 'combine_pvalues',
 'contingency',
 'cosine',
 'crystalball',
 'cumfreq',
 'describe',
 'dgamma',
 'dirichlet',
 'distributions',
 'division',
 'dlaplace',
 'dweibull',
 'energy_distance',
 'entropy',
 'epps_singleton_2samp',
 'erlang',
 'expon',
 'exponnorm',
 'exponpow',
 'exponweib',
 'f',
 'f_oneway',
 'fatiguelife',
 'find_repeats',
 'fisher_exact',
 'fisk',
 'fligner',
 'foldcauchy',
 'foldnorm',
 'frechet_l',
 'frechet_r',
 'friedmanchisquare',
 'gamma',
 'gausshyper',
 'gaussian_kde',
 'genexpon',
 'genextreme',
 'gengamma',
 'genhalflogistic',
 'genlogistic',
 'gennorm',
 'genpareto',
 'geom',
 'gilbrat',
 'gmean',
 'gompertz',
 'gstd',
 'gumbel_l',
 'gumbel_r',
 'halfcauchy',
 'halfgennorm',
 'halflogistic',
 'halfnorm',
 'hmean',
 'hypergeom',
 'hypsecant',
 'invgamma',
 'invgauss',
 'invweibull',
 'invwishart',
 'iqr',
 'itemfreq',
 'jarque_bera',
 'johnsonsb',
 'johnsonsu',
 'kappa3',
 'kappa4',
 'kde',
 'kendalltau',
 'kruskal',
 'ks_2samp',
 'ksone',
 'kstat',
 'kstatvar',
 'kstest',
 'kstwobign',
 'kurtosis',
 'kurtosistest',
 'laplace',
 'levene',
 'levy',
 'levy_l',
 'levy_stable',
 'linregress',
 'loggamma',
 'logistic',
 'loglaplace',
 'lognorm',
 'logser',
 'lomax',
 'mannwhitneyu',
 'matrix_normal',
 'maxwell',
 'median_absolute_deviation',
 'median_test',
 'mielke',
 'mode',
 'moment',
 'mood',
 'morestats',
 'moyal',
 'mstats',
 'mstats_basic',
 'mstats_extras',
 'multinomial',
 'multivariate_normal',
 'mvn',
 'mvsdist',
 'nakagami',
 'nbinom',
 'ncf',
 'nct',
 'ncx2',
 'norm',
 'normaltest',
 'norminvgauss',
 'obrientransform',
 'ortho_group',
 'pareto',
 'pearson3',
 'pearsonr',
 'percentileofscore',
 'planck',
 'pointbiserialr',
 'poisson',
 'power_divergence',
 'powerlaw',
 'powerlognorm',
 'powernorm',
 'ppcc_max',
 'ppcc_plot',
 'print_function',
 'probplot',
 'randint',
 'random_correlation',
 'rankdata',
 'ranksums',
 'rayleigh',
 'rdist',
 'recipinvgauss',
 'reciprocal',
 'relfreq',
 'rice',
 'rv_continuous',
 'rv_discrete',
 'rv_histogram',
 'rvs_ratio_uniforms',
 'scoreatpercentile',
 'sem',
 'semicircular',
 'shapiro',
 'siegelslopes',
 'sigmaclip',
 'skellam',
 'skew',
 'skewnorm',
 'skewtest',
 'spearmanr',
 'special_ortho_group',
 'statlib',
 'stats',
 't',
 'test',
 'theilslopes',
 'tiecorrect',
 'tmax',
 'tmean',
 'tmin',
 'trapz',
 'triang',
 'trim1',
 'trim_mean',
 'trimboth',
 'truncexpon',
 'truncnorm',
 'tsem',
 'tstd',
 'ttest_1samp',
 'ttest_ind',
 'ttest_ind_from_stats',
 'ttest_rel',
 'tukeylambda',
 'tvar',
 'uniform',
 'unitary_group',
 'variation',
 'vonmises',
 'vonmises_line',
 'wald',
 'wasserstein_distance',
 'weibull_max',
 'weibull_min',
 'weightedtau',
 'wilcoxon',
 'wishart',
 'wrapcauchy',
 'yeojohnson',
 'yeojohnson_llf',
 'yeojohnson_normmax',
 'yeojohnson_normplot',
 'yulesimon',
 'zipf',
 'zmap',
 'zscore']
In [37]:
dir(np.linalg)
Out[37]:
['LinAlgError',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 '_umath_linalg',
 'absolute_import',
 'cholesky',
 'cond',
 'det',
 'division',
 'eig',
 'eigh',
 'eigvals',
 'eigvalsh',
 'info',
 'inv',
 'lapack_lite',
 'linalg',
 'lstsq',
 'matrix_power',
 'matrix_rank',
 'multi_dot',
 'norm',
 'pinv',
 'print_function',
 'qr',
 'slogdet',
 'solve',
 'svd',
 'tensorinv',
 'tensorsolve',
 'test']
In [47]:
dir(np.random)
Out[47]:
['Generator',
 'MT19937',
 'PCG64',
 'Philox',
 'RandomState',
 'SFC64',
 'SeedSequence',
 '__RandomState_ctor',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 '_pickle',
 'absolute_import',
 'beta',
 'binomial',
 'bit_generator',
 'bounded_integers',
 'bytes',
 'chisquare',
 'choice',
 'common',
 'default_rng',
 'dirichlet',
 'division',
 'exponential',
 'f',
 'gamma',
 'generator',
 'geometric',
 'get_state',
 'gumbel',
 'hypergeometric',
 'laplace',
 'logistic',
 'lognormal',
 'logseries',
 'mt19937',
 'mtrand',
 'multinomial',
 'multivariate_normal',
 'negative_binomial',
 'noncentral_chisquare',
 'noncentral_f',
 'normal',
 'pareto',
 'pcg64',
 'permutation',
 'philox',
 'poisson',
 'power',
 'print_function',
 'rand',
 'randint',
 'randn',
 'random',
 'random_integers',
 'random_sample',
 'ranf',
 'rayleigh',
 'sample',
 'seed',
 'set_state',
 'sfc64',
 'shuffle',
 'standard_cauchy',
 'standard_exponential',
 'standard_gamma',
 'standard_normal',
 'standard_t',
 'test',
 'triangular',
 'uniform',
 'vonmises',
 'wald',
 'weibull',
 'zipf']

II. Left and Right inverses

In [52]:
A = np.array([[[-3,-4],[4,6],[1,1]]])
B = 1/9*np.array([[-11,-10,16],[7,8,-11]])
B@A
Out[52]:
array([[[ 1.00000000e+00, -8.88178420e-16],
        [ 2.22044605e-16,  1.00000000e+00]]])
In [55]:
C = 1/2*np.array([[0,-1,6],[0,1,-4]])
#np.matmul(C,A)
C@A
Out[55]:
array([[[1., 0.],
        [0., 1.]]])
drawing
drawing
drawing
In [56]:
A = np.array([[[-3,-4],[4,6],[1,1]]])
B = 1/9*np.array([[-11,-10,16],[7,8,-11]])
C = 1/2*np.array([[0,-1,6],[0,1,-4]])

print(B@A)
print(C@A)
[[[ 1.00000000e+00 -8.88178420e-16]
  [ 2.22044605e-16  1.00000000e+00]]]
[[[1. 0.]
  [0. 1.]]]
In [58]:
b = np.array([1,-2,0])

print(B@b)
print(C@b)
[ 1. -1.]
[ 1. -1.]
In [59]:
x = B@b
A@x
Out[59]:
array([[ 1.00000000e+00, -2.00000000e+00,  2.22044605e-16]])
In [60]:
np.linalg.inv(A)
---------------------------------------------------------------------------
LinAlgError                               Traceback (most recent call last)
<ipython-input-60-ae645f97e1f8> in <module>
----> 1 np.linalg.inv(A)

<__array_function__ internals> in inv(*args, **kwargs)

~\Anaconda3\envs\TF2\lib\site-packages\numpy\linalg\linalg.py in inv(a)
    544     a, wrap = _makearray(a)
    545     _assertRankAtLeast2(a)
--> 546     _assertNdSquareness(a)
    547     t, result_t = _commonType(a)
    548 

~\Anaconda3\envs\TF2\lib\site-packages\numpy\linalg\linalg.py in _assertNdSquareness(*arrays)
    211         m, n = a.shape[-2:]
    212         if m != n:
--> 213             raise LinAlgError('Last 2 dimensions of the array must be square')
    214 
    215 def _assertFinite(*arrays):

LinAlgError: Last 2 dimensions of the array must be square
drawing
drawing
drawing
In [78]:
A = np.array([[-3,-4],[4,6],[1,1]])
B = 1/9*np.array([[-11,-10,16],[7,8,-11]])
C = 1/2*np.array([[0,-1,6],[0,1,-4]])

At = A.transpose()
Bt = B.transpose()
Ct = C.transpose()

print(At@Bt)
print(At@Ct)
[[ 1.00000000e+00  2.22044605e-16]
 [-8.88178420e-16  1.00000000e+00]]
[[1. 0.]
 [0. 1.]]
In [82]:
b = np.array([1,2])
print(Bt@b)
print(Ct@b)

xB = Bt@b
xC = Ct@b
[ 0.33333333  0.66666667 -0.66666667]
[ 0.   0.5 -1. ]
In [83]:
print(At@xB)
[1. 2.]
In [84]:
print(At@xC)
[1. 2.]
In [74]:
print(At.shape)
print(Bt.shape)
(2, 3)
(3, 2)

III. "Inverses"

drawing
drawing
drawing
drawing
drawing
In [87]:
A = np.array([[1,-2,3],[0,2,2],[-3,-4,-4]])
Ainv = 1/30*np.array([[0,-20,-10],[-6,5,-2],[6,10,2]])

print(A@Ainv)
print(Ainv@A)
[[ 1.00000000e+00 -5.55111512e-17  1.38777878e-17]
 [ 0.00000000e+00  1.00000000e+00  0.00000000e+00]
 [ 0.00000000e+00  2.22044605e-16  1.00000000e+00]]
[[ 1.00000000e+00  0.00000000e+00  0.00000000e+00]
 [-1.38777878e-17  1.00000000e+00 -1.11022302e-16]
 [ 1.38777878e-17 -5.55111512e-17  1.00000000e+00]]
In [88]:
print(np.linalg.inv(A))
[[-3.70074342e-17 -6.66666667e-01 -3.33333333e-01]
 [-2.00000000e-01  1.66666667e-01 -6.66666667e-02]
 [ 2.00000000e-01  3.33333333e-01  6.66666667e-02]]
In [89]:
print(Ainv)
[[ 0.         -0.66666667 -0.33333333]
 [-0.2         0.16666667 -0.06666667]
 [ 0.2         0.33333333  0.06666667]]
drawing

II.A. Inverse Examples

Diagonal matrices

Identity Matrix

$I_3 = \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0 \\ 0 & 0 & 1\\ \end{bmatrix}$

Diagonal matrix with nonzero diagonal elements $D = \begin{bmatrix} 2 & 0 & 0\\ 0 & 3 & 0 \\ 0 & 0 & 4\\ \end{bmatrix}$

Diagonal matrix with zeros on the diagonal $D = \begin{bmatrix} 2 & 0 & 0\\ 0 & 0 & 0 \\ 0 & 0 & 4\\ \end{bmatrix}$

Use simplicity of matrix multiplication for diagonal matrices to get inverse

drawing
Consider meaning of reverse transformation to get inverse

"Orthogonal matrices"

  • square matrix with othonormal columns $Q^TQ = I$ so $Q^{-1} = Q^T$
  • should be called "orthonormal matrix"
  • Generalized rotation and/or reflection matrix

Apply definition of orthonormal to columns to prove inverse

drawing
drawing

III. Inverses and QR

drawing
drawing
drawing
drawing
drawing
drawing
In [97]:
import numpy as np

A = np.array([[1,2,3],[3,1,5],[1,7,8]])
b = np.array([5,6,7])
In [98]:
# solve Ax = b

x1 = np.linalg.inv(A)@b
print(x1)
[11.2  7.4 -7. ]
In [99]:
# use QR

(Q,R) = np.linalg.qr(A)

print(Q)
print(R)
[[-0.30151134  0.14213381 -0.94280904]
 [-0.90453403 -0.35533453  0.23570226]
 [-0.30151134  0.92386977  0.23570226]]
[[-3.31662479 -3.61813613 -7.83929496]
 [ 0.          6.39602149  6.04068696]
 [ 0.          0.          0.23570226]]
In [101]:
Q@Q.transpose()
Out[101]:
array([[ 1.00000000e+00, -1.41842014e-16, -1.74359693e-16],
       [-1.41842014e-16,  1.00000000e+00,  1.38501378e-17],
       [-1.74359693e-16,  1.38501378e-17,  1.00000000e+00]])
In [103]:
x2 = np.linalg.inv(R)@(Q.transpose()@b)
print(x2)
[11.2  7.4 -7. ]

IV. Polynomial interpolation

drawing
drawing
drawing
drawing

V. Pseudoinverse

drawing
drawing
drawing
drawing