您的位置:首页 > 编程语言 > Python开发

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息