首先我们知道dot运算时不满足交换律的,所以np.dot(a,b)和a.dot(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
但是对于下面这种情况也可以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]
规律: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)