美文网首页
python array使用过程中遇到的坑(持续更新)

python array使用过程中遇到的坑(持续更新)

作者: 不分享的知识毫无意义 | 来源:发表于2019-05-20 22:37 被阅读0次

       array和mat的计算思想是不同的,同学们千万别把mat的计算思想想当然的放入到array计算中,否则报错的时候都不知道错在哪。
      首先我们都知道np.mat的计算方式,就是我们线性代数中学到到的矩阵相乘,一个n行m列的矩阵和一个m行n列的矩阵相乘,最后得到的是n行n列的矩阵,这个没有任何问题,大家一定要继续保持这个思路,不会线性代数的同学自己去看书,至少要会矩阵相乘吧。
      但是到了array数组,其中的坑就比较多了。分别来看一下:

    1 数组切片

      假设我们有一个100*10的数组a,现在我取切片a[1],我们是不是觉得会输出第2行的数据,维度应该是1*10,但是事实表明,输出的数组自动给你转置了,输出维度其实是10*1。下面来实验一下。

    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 <class 'numpy.ndarray'>
    the shape of a is:  (100, 10)
    the type of a_cut is <class 'numpy.ndarray'>
    the shape of a_cut is:  (10,)
    the type of a_cut1 is <class 'numpy.ndarray'>
    the shape of a_cut1 is:  (10,)
    

      从上面可以看出,我及时明显指出我就要第二行的数据,array也是自动给转换成10*1的了。这个和矩阵有区别的,用的时候需要注意下。

    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啊,比如一个2*2和一个2*1的,没有对应位置,咋输出啊,这个不好理解还是先看例子。

    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,就可以遍历了,这种情况比较普遍,写模型的时候要注意。

    相关文章

      网友评论

          本文标题:python array使用过程中遇到的坑(持续更新)

          本文链接:https://www.haomeiwen.com/subject/yytlzqtx.html