python3 numpy中数组相乘np.dot(a,b)运算规则解析

python np.dot(a,b)运算规则解析

首先我们知道dot运算时不满足交换律的,所以np.dot(a,b)和a.dot(b)运算结果是一样的

1.numpy中数组相乘np.dot(a,b)运算条件:

对于两数组a和b :

a = np.array([[2,2,2,1],[3,3,3,1],[4,4,4,4]])  # shape=(3,4)
b = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])  # shape=(4,3)

对于上面两个数组a,b:
np.dot(a,b)的运算条件为:b中最小单位的[ ]个数4等于a中最小[ ]单位中的元素个数4

  • 简单来说一般规律就是:如果a.shape=(m,n),b.shape=(x,y)那么np.dot(a,b)的运算条件为:n=x
    同理对于np.dot(b,a) 的运算条件: 需满足a中最小[]的个数(m)等于b中最小[]中元素的个数(y).

但是对于下面这种情况也可以dot:a.shape=(3,) b.shape=(3,1),也可以执行np.dot(b,a)(注意不是np.dot(a,b))

a = np.array([[3],[3],[3]]) #(3,1)
b = np.array([2,2,1]) # (3,)

结果:shape=(1,)
[15]
因此,可以归纳为:
假设a.shape=(m,n),b.shape=(x,y)
如果n不为空,那么np.dot(a,b)运算条件为:n=x
如果n为空,那么np.dot(a,b)运算条件为:m=x
y是否为空不影响这个规律

e.g:

import numpy as np
a = np.array([[2,2],[3,3],[4,4]])
b = np.array([[1,1,1],[2,2,2]])
c = np.array([[3],[3],[3]]) #(3,1)
d = np.array([2,2,1]) # (3,)

print(np.dot(a,b)) #b中最小[]的个数为2,等于a中最小[]中元素的个数2;这里反过来a中最小单位[]的个数3也等于b中最小[]中的元素个数3;

print(np.dot(d,c))
'''注意这里c中最小[]的个数为3,等于d中最小[]中元素的个数3;
但是反过来d中最小[]的个数为1,而c中最小[]中的元素个数为3,并不相等'''

# print(np.dot(c,d))
# ValueError: shapes (3,1) and (3,) not aligned: 1 (dim 1) != 3 (dim 0),这个是无法计算(维度不匹配)

总结:对于np.dot(a,b)只有满足b中最小[]的个数等于a中最小[]中元素的个数两者才可以相dot

输出结果:

[[ 6  6  6]
 [ 9  9  9]
 [12 12 12]]
[15]

2.np.dot(a,b)运算之后的结果解析

规律:dot之后会将两组数组中相等的(符合dot条件的)维度消掉,得到剩下的维度组合成新的数组,如果剩下只有一个维度则为行(对应一维),列是无
对于a.shape=(m,n),b.shape=(x,y)
dot之后n和x会消掉,结果shape变成(m,y)
如果n为空,shape变为(y,)
e.g1:

a = np.array([1,1,1]) # shape=(3,)
b = np.array([[3],[3],[3]]) # shape=(3,1)

print(np.dot(a,b))
print(np.dot(a,b).shape)

那么,3和3消掉,剩下只有一个数1,对应1行没有列==>(1,)
运算结果:
[9]
(1,)

e.g2:

a.shape=(4,1) 
b.shape=(1,4)

那么( 1和1消掉,剩下(4,4) )
np.dot(a,b)的shape为(4,4)

你可能感兴趣的:(python3 numpy中数组相乘np.dot(a,b)运算规则解析)