NumPy中ndarray和matrix的四则运算
2017-12-14 17:05
976 查看
ndarray
NumPy中最重要的类是ndarray,顾名思义,即多维数组。
import numpy as np
行向量:
a = np.array([1,2,3]) # a.shape=(3L,)
列向量:
b = np.array([[1],[2],[3]]) # b.shape=(3L, 1L)
二维矩阵:
M = np.array([[1,2,3],[4,5,6],[7,8,9]] # M.shape=(3L, 3L)
四则运算(+-*/),注意多维数组ndarray中“加减乘除”跟数学中的矩阵运算没有半毛钱关系。
运算都是Element-wise的,当两个数组维度不一样时,维度小的会拓展复制(Broadcast)跟维度大的数组一样。
例如上面的行向量
a和列向量
b分别与
M进行四则运算时,会拓展为:
a→⎡⎣⎢111222333⎤⎦⎥,b→⎡⎣⎢123123123⎤⎦⎥
例子:
a + M:
[123]+⎡⎣⎢147258369⎤⎦⎥=⎡⎣⎢1+14+17+12+25+28+23+36+39+3⎤⎦⎥=⎡⎣⎢25848106912⎤⎦⎥
b + M:
⎡⎣⎢123⎤⎦⎥+⎡⎣⎢147258369⎤⎦⎥=⎡⎣⎢1+14+27+32+15+28+33+16+29+3⎤⎦⎥=⎡⎣⎢261037114812⎤⎦⎥
b - M:
⎡⎣⎢123⎤⎦⎥−⎡⎣⎢147258369⎤⎦⎥=⎡⎣⎢1−12−43−71−22−53−81−32−63−9⎤⎦⎥=⎡⎣⎢0−2−4−1−3−5−2−4−6⎤⎦⎥
b * M:
⎡⎣⎢123⎤⎦⎥×⎡⎣⎢147258369⎤⎦⎥=⎡⎣⎢1∗14∗27∗32∗15∗28∗33∗16∗29∗3⎤⎦⎥=⎡⎣⎢18212102431227⎤⎦⎥
b / M:
⎡⎣⎢123⎤⎦⎥/⎡⎣⎢147258369⎤⎦⎥=⎡⎣⎢1/12/43/71/22/53/81/32/63/9⎤⎦⎥=⎡⎣⎢100000000⎤⎦⎥
当
a是4维的行向量与
M运算呢?
例如
a = [1, 2, 3, 4],
a + M等于多少呢? 此时会报错:
ValueError: operands could not be broadcast together with shapes (4,) (3,3)
matrix
那NumPy中难道就没有像数学中的矩阵乘法运算了吗?答案是有的,这里就要用到matrix类,其有一个别名
mat,用法是一样的。
行向量:
p = np.mat([1,2,3]) # p.shape=(1L, 3L)
列向量:
q = np.mat([[1],[2],[3]]) # q.shape=(3L, 1L)
二维矩阵:
N = np.mat([[1,2,3],[4,5,6],[7,8,9]]) # N.shape=(3L, 3L)
它们之间的加减除跟ndarray是一样的,但乘就按照数学矩阵乘法:
p * N:
[123]×⎡⎣⎢147258369⎤⎦⎥=[303642]
q * N则会报错:
ValueError: shapes (3,1) and (3,3) not aligned: 1 (dim 1) != 3 (dim 0)
对于matrix,数据均以二维的形式存储,例如:
p:
matrix([[1, 2, 3]])
q:
matrix([[1], [2], [3]])
p * q(结果是一个标量):
matrix([[14]])
np.dot()和np.multiply()
ndarray数组可以实现矩阵的乘法,即:np.dot(a, b) # array([14]) np.dot(a, M) # array([30, 36, 42]) np.dot(a, a) # 14;特别地,两个行向量得到数学中的内积 np.dot(b, b) # 报错!
matrix可以实现Element-wise的点乘,即:
np.multiply(p, N) Out: matrix([[ 1, 4, 9], [ 4, 10, 18], [ 7, 16, 27]])
注意区分数学中的点乘和计算机中的点乘:数学中的点乘也叫点积、内积,是两个向量中的元素分别相乘再相加得到一个标量;而计算机中的点乘就是指Element-wise的乘法。
ndarray和matrix之间相互转换
np.asarray(matrix) np.asmatrix(ndarray)
注意如果ndarray是3维及以上的数组,则转不了matrix,因为matrix总是二维的。
如:
t = np.arange(12).reshape(2, 2, 3) Out: array([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]])
np.asmatrix(t) # ValueError: shape too large to be a matrix.
相关文章推荐
- python如何保存矩阵,保存matrix,保存numpy.ndarray
- numpy中matrix 和 array的区别
- numpy基础——ndarray对象方法
- np.newaxis 为 numpy.ndarray(多维数组)增加一个轴
- numpy中的ndarray方法和属性
- numpy 中的ndarray数组返回符合特定条件的索引方法
- numpy之初识ndarray
- 数学之路-python计算实战(6)-numpy-ndarray
- numpy.ndarray 如何转化为 list
- numpy核心数据结构-ndarray
- Numpy 二维矩阵 乘以 三维矩阵 (Numpy, 2D matrix multiplies 3D matrix)
- 'numpy.ndarray' python.list
- numpy中matrix 和 array的区别
- Numpy中矩阵对象(matrix)
- AttributeError: 'numpy.ndarray' object has no attribute 'index'
- numpy中的matrix与array的区别
- 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍
- numpy中的ndarray方法和属性
- has invalid type <class 'numpy.ndarray'>, must be a string or Tensor
- numpy的ndarray与pandas的series和dataframe之间互转