美文网首页
cupy或numpy中"数组"与"矩阵"的区别

cupy或numpy中"数组"与"矩阵"的区别

作者: 胜负55开 | 来源:发表于2019-10-26 16:48 被阅读0次

前言:

cupy和numpy在矩阵和数组的使用上没有区别,在认识/创建层面有一些区别。

  • numpy中:任何创建函数,创建的都是数组(type数据类型:numpy.ndarray)!例如:np.array、np.arrange、np.zeros等等;只有经过np.mat()转换后的数组,才会变成矩阵(type数据类型:numpy.matrix)!
  • cupy中:数组和矩阵的概念基本混用,只有一点可以区别彼此:一维和二维时,矩阵 = 数组,二维以上时只能是数组。

在numpy和cupy中,"数组"和"矩阵"数据类型的区别如下:

  • 一维和二维时:数组 = 矩阵,不需要多余说明,各种线性代数的矩阵操作可以直接使用;
  • 二维以上时:只能是数组!因为矩阵的定义就是其维度不能高于二维,即三维以上没有矩阵的概念,纯粹是数组概念里的高维。因此,对于三维及以上的数组,不能也没必要转为矩阵。
  • 不论几维:线性代数对矩阵的操作(如矩阵乘法),不管对象数据类型是矩阵还是数组,结果都是一样的!!

(1)numpy中各种函数创建的"数据类型"的例子:

# 用numpy函数创建的数据类型,都是以"数组"开始的!
import numpy as np

a = [1, 2, 3] ; b = [4, 5, 6]

w1 = np.array([a,b])
w2 = np.arange(2,10,2)
w3 = np.zeros( (2,3) )
w4 = np.zeros( (2,3,4) )

print( type(w1), type(w2), type(w3) )   # 结果:numpy.ndarray

(2)numpy中把原始的"数组转成矩阵"的唯一方式:

# np.mat函数:把数组类型转为矩阵类型
import numpy as np
a = [1, 2, 3] ; b = [4, 5, 6]

w1 = np.mat( np.array([a,b]) )
w2 = np.mat( np.arange(2,10,2) )
w3 = np.mat( np.zeros( (2,3) ) )

print( type(w1), type(w2), type(w3) )  # 结果:numpy.matrix

(3)当原始"数组高于二维时",无法转为矩阵:

# 三维及以上数组无法通过np.mat()函数转为矩阵:因为不存在3维(及以上)矩阵这个概念!
import numpy as np

a = [1, 2, 3] ; b = [4, 5, 6]
w4 = np.array( [[a,b,a], [a,b,a]] )
w5 = np.zeros( (2,3,4) )

# 结果:报如下错误:
ValueError: shape too large to be a matrix.

(4)"二维数组"可直接进行各种线性代数的矩阵操作(无需先转为矩阵):

# 二维数组直接进行矩阵相乘:
import numpy as np

a = [1, 2]; b = [3, 4]

# 直接用二维数组计算矩阵相乘:
w6 = np.array( [a,b] )
result1 = np.matmul(w6,w6)

# 先转为二维矩阵,再进行矩阵相乘:
w7 = np.mat(w6)
result2 = np.matmul(w7,w7)

# 结果数值都一样,只是数据类型不同:
result1
Out[3]: 
array([[ 7, 10],
       [15, 22]])

result2
Out[4]: 
matrix([[ 7, 10],
        [15, 22]])

(5)"三维及以上数组",进行线性代数矩阵运算,结果和低维矩阵一样!

import numpy as np

a = [1, 2, 3] ; b = [4, 5, 6]; c = [7, 8, 9]

# 高维数组进行矩阵乘法:
w8 = np.array( [[a,b], [a,b], [a,b]] )
w9 = np.array( [[a,b,c], [a,b,c], [a,b,c]] )

result3 = np.matmul(w8,w9)

# 对应的低维矩阵的矩阵乘法:
w10 = np.mat( np.array( [a,b] ) )
w11 = np.mat( np.array( [a,b,c] ) )

result4 = np.matmul(w10,w11)

# 结果:
result3
Out[3]: 
array([[[30, 36, 42],
        [66, 81, 96]],

       [[30, 36, 42],
        [66, 81, 96]],

       [[30, 36, 42],
        [66, 81, 96]]])

result4
Out[4]: 
matrix([[30, 36, 42],
        [66, 81, 96]])

总结:

  • numpy:任何创建函数得到的最初数据类型都是数组;一维和二维时,可以用专门的np.mat()函数把数组转为矩阵;但不管是几维,对数组或矩阵进行线性代数的矩阵运算时,得到的结果都是一致的!因此其实也"没必要把数组转矩阵(不管几维)"!不管几维,"全部当成数组"就可以。
  • cupy:同numpy中黑体所说,因此cupy直接去掉了:一维和二维数组还能用专门函数转为专门的矩阵。同样,cupy中不管几维,都"全部当成数组"即可!

相关文章

  • cupy或numpy中"数组"与"矩阵"的区别

    前言: cupy和numpy在矩阵和数组的使用上没有区别,在认识/创建层面有一些区别。 numpy中:任何创建函数...

  • CuPy内存管理

    CuPy是CUDA加速的NumPy兼容矩阵库,可以直接把Numpy的数组转为CuPy,提高运算速度。 内存管理 默...

  • Cupy的用处概述

    前提:传统的数组和矩阵都是通过numpy来设定,然后numpy来调用cpu计算!cupy的作用:数组和矩阵都是通过...

  • numpy矩阵和数组的区别

    numpy矩阵和数组的区别 numpy矩阵(matrix)是严格二维的,而numpy数组(ndarray)是N维 ...

  • 高维数组的"矩阵相乘"

    需求:高维(至少3维以上)的两个数组,进行线性代数中的矩阵相乘!下面的规律numpy和cupy都适用。 两个数组尺...

  • Cupy与Numpy的数据类型互转

    用cupy和numpy直接创建的数组/矩阵,类型是不一样的!无法相互之间进行运算。 用type查看二者的数据类型:...

  • 创建NumPy数组(和矩阵)

    numpy.zeros() 创建零数组或者零矩阵 numpy.ones() 获得全一的数组或者矩阵 numpy.f...

  • cupy数组赋值

    给数组进行初始化时,numpy确实要比cupy好用!因为numpy完全认识python自带的各种数据类型,如列表、...

  • Python 学习笔记 113

    2020年2月12日19:49:14 Numpy 中数组的形状 Numpy中数组的形状表示矩阵的行列数 三维数组修...

  • Numpy-创建数据

    创建数据 创建ndarray NumPy的数组类被称作ndarray。通常被称作数组。 Numpy库中的矩阵模块为...

网友评论

      本文标题:cupy或numpy中"数组"与"矩阵"的区别

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