zoukankan      html  css  js  c++  java
  • python中ndarray和matrix

    1. 定义ndarray和matrix

    from numpy import *
    
    a = mat([[1,2],[3,4]])
    b = mat([[5,6],[7,8]])
    c = array([1,2],[3,4])
    d = array([5,6],[7,8])

    看看输出他们会不会有什么区别

    print(a)
    print(c)
    
    >>[[1 2]
       [3 4]] 
      [[1 2]
       [3 4]]
    #发现输出的matrix和array是一模一样的
    print(type(a))
    print(type(c))
    
    >> <class 'numpy.matrix'>
       <class 'numpy.ndarray'>

    2. ndarray可以是任意维数,matrix只能是2维

    A = array([[[1,2]]]) #正常不报错
    B = mat([[[1,2]]])   #报错
    
    >>ValueError: matrix must be 2-dimensional

    3. 乘法

    3.1 ndarray

    3.1.1 叉乘

    print(c)
    print(d)
    print(np.dot(c,d))
    
    >>[[1 2]
      [3 4]]
      [[5 6]
      [7 8]]
      [[19 22]
      [43 50]]
    #可以看出ndarray也可以像矩阵一样进行叉乘,但需要满足矩阵叉乘的条件(第一个矩阵的列数等于第二个矩阵的行数)

    3.1.2 普通乘法

    print(c)
    print(d)
    print(c*d)
    
    >>[[1 2]
     [3 4]]
    [[5 6]
     [7 8]]
    [[ 5 12]
     [21 32]]
    #普通乘法是对应位置元素相乘

    3.2 matrix

    3.2.1 叉乘

    print(a)
    print(b)
    print(np.dot(a,b))
    
    >>[[1 2]
      [3 4]]
      [[5 6]
      [7 8]]
      [[19 22]
      [43 50]]
    #矩阵叉乘

    3.2.2 普通乘法

    print(a)
    print(b)
    print(a*b)
    
    >>[[1 2]
      [3 4]]
      [[5 6]
      [7 8]]
      [[19 22]
      [43 50]]
    #这里发现对于矩阵运算符"*"直接对应的是叉乘,和np.dot()效果相同
    print(a)
    print(b)
    print(np.multiply(a,b))
    
    >>[[1 2]
      [3 4]]
      [[5 6]
      [7 8]]
      [[ 5 12]
      [21 32]]
    #如果非要对矩阵进行普通乘法,可以通过np.multiply()实现

    那么ndarray和matrix能否混合做乘法呢,结果是点乘还是叉乘呢?

    print(a)
    print(b)
    print(a*d)
    
    >>[[1 2]
     [3 4]]
    [[5 6]
     [7 8]]
    [[19 22]
     [43 50]]
    #可以对matrix和ndarray进行混合乘法,这里的运算符"*"是叉乘

    当然啦也可以通过np.multiply()对matrix和ndarray进行点乘

    print(a)
    print(b)
    print(np.multiply(a,d))
    
    >>[[1 2]
      [3 4]]
      [[5 6]
      [7 8]]
      [[ 5 12]
      [21 32]]

    4. ndarray和matrix互相转换

    4.1 matrix → ndarray

    使用matrix对象的A属性或者np.asarray()方法

    e = a.A
    f = np.asarray(a)
    print(type(e))
    print(e)
    print(type(f))
    print(f)
    
    >><class 'numpy.ndarray'>
    [[1 2]
     [3 4]]
    <class 'numpy.ndarray'>
    [[1 2]
     [3 4]]
    #这两种方法都可以将matrix转化为ndarray

    但是需要注意注意通过转化得到的ndarray(在这里是e和f)和原始matrix(这里是a)共享内存空间,修改了a之后e和f的值也会被修改

    a[1,1] = 2
    print(e)
    print(f)
    
    >>[[1 2]
     [3 2]]
    [[1 2]
     [3 2]]
    #在修改了a中元素的值后e,f的值都随之改变

    当然了,在改变e或f的值后,a的值也会随之改变

    e[1,1] = 3
    print(a)
    
    >>[[1 2]
      [3 3]]

    4.2 ndarray → matrix

    使用np.asmatrix()方法

    e = np.asmatrix(c)
    print(e)
    
    >>[[1 2]
     [3 4]]

    同样的,通过转化得到的matrix和原始ndarray共享内存空间

    5. ndarray和matrix的其他区别

    5.1 matrix更多的操作方法

    matrix 和 array 都可以通过objects后面加.T 得到其转置。但是 matrix objects 还可以在后面加 .H f得到共轭矩阵, 加 .I 得到逆矩阵。

    5.2 **运算符

    ** 运算符的作用也不一样 :因为a是个matrix,所以a**2返回的是a*a,相当于矩阵相乘。而c是array,c**2相当于,c中的元素逐个求平方

    5.3 matrix维数总保持2维

    ndarray与matrix的最大的不同是,在做归约运算时,ndarray的维数会发生变化,但matrix总是保持为2维。例如下面求对行求平均值的运算

    print("matrix")
    print(a)
    print(a.mean(1))
    print("ndarray")
    print(c)
    print(c.mean(1))
    
    >>matrix
    [[1 2]
     [3 4]]
    [[1.5]
     [3.5]]
    ndarray
    [[1 2]
     [3 4]]
    [1.5 3.5]

    参考:https://blog.csdn.net/lylclz/article/details/79843437

  • 相关阅读:
    从尾到头打印链表
    剑指offer
    Codeforces Round #345
    算法入门系列之字符串
    【codenet】代码相似度计算框架调研 -- 把内容与形式分开
    【学习笔记--数据结构】合法的出栈序列与栈混洗
    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
    【PAT L2-001】最短路计数
    【CF689D Friends and Subsequences】二分搜索,区间查询
    【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集
  • 原文地址:https://www.cnblogs.com/RB26DETT/p/10974966.html
Copyright © 2011-2022 走看看