array和mat的计算思想是不同的,同学们千万别把mat的计算思想想当然的放入到array计算中,否则报错的时候都不知道错在哪。
首先我们都知道np.mat的计算方式,就是我们线性代数中学到到的矩阵相乘,一个n行m列的矩阵和一个m行n列的矩阵相乘,最后得到的是n行n列的矩阵,这个没有任何问题,大家一定要继续保持这个思路,不会线性代数的同学自己去看书,至少要会矩阵相乘吧。
但是到了array数组,其中的坑就比较多了。分别来看一下:
1 数组切片
假设我们有一个
的数组a,现在我取切片a[1],我们是不是觉得会输出第2行的数据,维度应该是
,但是事实表明,输出的数组自动给你转置了,输出维度其实是
。下面来实验一下。
a = np.random.random((100,10))
print("the type of a is %s" % type(a))
print("the shape of a is: ", np.shape(a))
a_cut = a[1]
print("the type of a_cut is %s" % type(a_cut))
print("the shape of a_cut is: ", np.shape(a_cut))
a_cut1 = a[1,:]
print("the type of a_cut1 is %s" % type(a_cut1))
print("the shape of a_cut1 is: ", np.shape(a_cut1))
---输出
the type of a is
the shape of a is: (100, 10)
the type of a_cut is
the shape of a_cut is: (10,)
the type of a_cut1 is
the shape of a_cut1 is: (10,)
从上面可以看出,我及时明显指出我就要第二行的数据,array也是自动给转换成
的了。这个和矩阵有区别的,用的时候需要注意下。
2 数组乘法
这个东西真的是太烦了,各种乘法,比如
、multiply、dot,还有一个更奇葩的one-hot编码和一个数组相乘,可以直接用切片,这个不建议初学者使用。我们来分别实验一下吧。
v = np.arange(1,5).reshape(2,2)
w = np.arange(0,4).reshape(2,2)
print("dot’s result is :",v.dot(w))
print("*’s result is :",v*w)
print("multiply’s result is :",np.multiply(v,w))
--结果
dot’s result is : [[ 4 7]
[ 8 15]]
*’s result is : [[ 0 2]
[ 6 12]]
multiply’s result is : [[ 0 2]
[ 6 12]]
对于数组而言,想用类似矩阵的乘法你只有一个选择那就是dot,既然是矩阵乘法,那你得维度可得满足矩阵相乘的规矩,要不然报错给你看啊。*和multiply的作用是相同的,都是数组对应位置相乘,但是这辆还有坑,两个数组维度不同,怎么multiply啊,比如一个
和一个
的,没有对应位置,咋输出啊,这个不好理解还是先看例子。
w1 = np.array([[1,2],[3,4]])
x1 = np.array([[1],[2]])
w1*x1
--输出
array([[1, 2],
[6, 8]])
这里用到的是广播机制,其实就是将x1由[[1],[2]]扩充为与w1相同维度的[[1,1],[2,2]]在进行对应位置的相乘,采用此原则则所有的*和multiply我们就都能掌握了。
最近看tenserflow,发现了一个新的乘法函数matmul,然后到numpy中查发现里边也有这个函数,当然要实验一把,发现这个函数也是矩阵乘,和dot不一样的地方在于,这个函数只支持np.matmul(x1,x2)而不支持x1.matmul(x2)。数组跟矩阵不一样的地方在于,如果是数组维度不匹配直接报错,而如果是矩阵则会自动交换两个参数位置看是否满足维度规律,如果还不满足才报错。
w1 = np.array([[1,2],[3,4]])
x1 = np.array([[1],[2]])
np.matmul(w1,x1)
--输出
array([[ 5],
[11]])
3 逻辑值切片
先看一个简单的例子,现在有一个array[4 4 3 4 2 3 3 1],我们取其中为4的数,代码如下:
array1 = np.array([4,4,3,4,2,3,3,1])
print(array1 == 4)
array1[array1 == 4]
--输出
[ True True False True False False False False]
array([4, 4, 4])
从上面代码看出 array1 == 4输出的是True和False组成的逻辑值,array进行逻辑切片的时候会保存逻辑真值对应位置的值,而逻辑假对应位置的值则会自动舍弃。
4 array遍历
很多时候啊,我们用模型返回的是一个ndarry,但遗憾的是这种数据类型不能遍历,怎么办呢,还有ndarray一半存储的是一个list,我们通过索引取相应位置的list,就可以遍历了,这种情况比较普遍,写模型的时候要注意。