tags: [笔记, Numpy, 矩阵运算]
categories: [笔记, Numpy, 矩阵运算]


开始之前

机器学习中的损失函数:image.png
代码实现:

  1. logprobs = np.multiply(-np.log(a3),Y) + np.multiply(-np.log(1 - a3), 1 - Y)
  2. loss = 1./m * np.nansum(logprobs)

numpy中array和matrix的区别:

matrix是array的分支,matrix和array操作在多数情况下都是一样的,但array操作更灵活,速度更快。

创建矩阵或数组

  1. import numpy as np
  2. a = np.array([2,3,4])
  3. print(a)
  4. print(a.shape,a.ndim,a.dtype,a.dtype.name,a.itemsize,a.size,a.data)
  5. b = np.arange(12).reshape(4,3)
  6. b
  7. m = np.asmatrix(b)
  8. type(m)
  1. [2 3 4]
  2. 'int32'
  3. (3,) 1 int32 int32 4 3 <memory at 0x000001AF30C23348>
  4. array([[ 0, 1, 2],
  5. [ 3, 4, 5],
  6. [ 6, 7, 8],
  7. [ 9, 10, 11]])
  8. numpy.matrix

广播运算

  1. # 广播运算
  2. a = np.array( [20,30,40,50] )
  3. b = np.arange(4)
  4. b
  5. c = a-b
  6. c
  7. b**2
  8. 10*np.sin(a)
  9. a<35
  1. array([0, 1, 2, 3])
  2. array([20, 29, 38, 47])
  3. array([0, 1, 4, 9], dtype=int32)
  4. array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
  5. array([ True, True, False, False])

矩阵乘法(元素乘、矩阵乘)

元素乘法:np.multiply(a,b)
矩阵乘法:np.dot(a,b) 或 np.matmul(a,b) 或 a.dot(b) 或直接用 a @ b !
唯独注意:*,在 np.array 中重载为元素乘法,在 np.matrix 中重载为矩阵乘法!

对于 np.array 对象

元素乘法 用 a*b 或 np.multiply(a,b)

  1. >>> a
  2. array([[1, 2],
  3. [3, 4]])
  4. >>> a*a
  5. array([[ 1, 4],
  6. [ 9, 16]])
  7. >>> np.multiply(a,a)
  8. array([[ 1, 4],
  9. [ 9, 16]])

矩阵乘法 用 np.dot(a,b) 或 np.matmul(a,b) 或 a.dot(b)或“@”

  1. >>> np.dot(a,a)
  2. array([[ 7, 10],
  3. [15, 22]])
  4. >>> np.matmul(a,a)
  5. array([[ 7, 10],
  6. [15, 22]])
  7. >>> a.dot(a)
  8. array([[ 7, 10],
  9. [15, 22]])
  10. >>> a@a
  11. array([[ 7, 10],
  12. [15, 22]])

对于 np.matrix 对象

元素乘法 用 np.multiply(a,b)

  1. >>> A
  2. matrix([[1, 2],
  3. [3, 4]])
  4. >>> np.multiply(A,A)
  5. matrix([[ 1, 4],
  6. [ 9, 16]])

矩阵乘法 用 “*”或“@” 或 np.dot(a,b) 或 np.matmul(a,b) 或 a.dot(b)

  1. >>> A*A
  2. matrix([[ 7, 10],
  3. [15, 22]])
  4. >>> A@A
  5. matrix([[ 7, 10],
  6. [15, 22]])
  7. >>> np.dot(A,A)
  8. matrix([[ 7, 10],
  9. [15, 22]])
  10. >>> np.matmul(A,A)
  11. matrix([[ 7, 10],
  12. [15, 22]])
  13. >>> A.dot(A)
  14. matrix([[ 7, 10],
  15. [15, 22]])

矩阵的其他操作(转置、求逆…)

  1. import numpy as np
  2. a = np.array([[1.0, 2.0], [3.0, 4.0]])
  3. print(a)
  4. a.transpose() # 转置
  5. np.linalg.inv(a) # 求逆
  6. u = np.eye(2) # 2x2 unit matrix; "eye" represents "I"
  7. u
  8. j = np.array([[0.0, -1.0], [1.0, 0.0]])
  9. j
  10. j @ j # matrix product
  11. np.trace(u) # trace
  12. y = np.array([[5.], [7.]])
  13. np.linalg.solve(a, y)
  14. np.linalg.eig(j)
  1. [[1. 2.]
  2. [3. 4.]]
  3. array([[1., 3.],
  4. [2., 4.]])
  5. array([[-2. , 1. ],
  6. [ 1.5, -0.5]])
  7. array([[1., 0.],
  8. [0., 1.]])
  9. array([[ 0., -1.],
  10. [ 1., 0.]])
  11. array([[-1., 0.],
  12. [ 0., -1.]])
  13. 2.0
  14. array([[-3.],
  15. [ 4.]])
  16. (array([0.+1.j, 0.-1.j]),
  17. array([[0.70710678+0.j , 0.70710678-0.j ],
  18. [0. -0.70710678j, 0. +0.70710678j]]))