NumPy中ndarray和matrix的四则运算

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进行四则运算时,会拓展为:

a111222333,b123123123

例子:

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

123147258369=112437122538132639=024135246

b * M

123×147258369=114273215283316293=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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手撕机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值