美文网首页
numpy矩阵和数组的区别

numpy矩阵和数组的区别

作者: ab02f58fd803 | 来源:发表于2020-04-19 11:42 被阅读0次

numpy矩阵和数组的区别

numpy矩阵(matrix)是严格二维的,而numpy数组(ndarray)N维 。矩阵对象是ndarray的子​​类。因此它继承了ndarray的所有属性和方法。

1. numpy矩阵的主要优点

[numpy矩阵](https://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.html

它可以为线性代数的矩阵运算提供方便的表示法,
例如,如果a和b是矩阵,则“ a * b”是它们的矩阵乘积,“ a.T”是它的转置矩阵。

2. numpy数组的主要优点

[numpy数组](https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html

它可以是多个二维矩阵,例如,对于CNN来说非常方便。

3. 比较代码

import numpy as np 

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

aArr = np.array(a)
bArr = np.array(b)
print('the type of aArr is {}'.format(type(aArr)))
aMat = np.mat(a)
bMat = np.mat(b)
print('the type of aMat is {}'.format(type(aMat)))

3.1. 转换

结论

1.使用np.mat()和np.array()更方便。
2.对于矩阵,我们还可以将aMat.A和aMat.A1用于ndarray对象和扁平化的ndarray。

## ndarray to matrix
aMat_temp = np.asmatrix(aArr)
print('the type of aMat_temp is {}'.format(type(aMat_temp)))
## or it is ok
aMat_temp = np.mat(aArr)
print('the type of aMat_temp is {}'.format(type(aMat_temp)))

## matrix to ndarray 
aArr_temp = np.asarray(aMat)
print('the type of aMat_temp is {}'.format(type(aArr_temp)))
## or it is ok
aArr_temp = np.array(aMat)
print('the type of aMat_temp is {}'.format(type(aArr_temp)))

aArr_temp = aMat.A
print(aArr_temp)
print('the type of aMat_temp is {}'.format(type(aArr_temp)))

3.2. 转置

结论

1.将aMat.T用于矩阵,并将np.transpose(aArr)用于ndarray。
2.但是,np.transpose()对于N维具有更有用的功能。

## for matrix
aMat_T = aMat.T
print('the aMat is \n{}'.format(aMat))
print('the aMat transpose is \n{}'.format(aMat_T))

## for ndarray, use the function np.transpose() it's ok 
aArr_T = np.transpose(aArr)
print('the aArr is \n{}'.format(aArr))
print('the aArr transpose is \n{}'.format(aArr_T))

3.3. 逆

对于线性代数来说,这是一个非常重要的概念,比如,它用于基于最小二乘法的线性回归中。

结论

1.将aMat.I用于矩阵,并将np.linalg.inv(aArr)用于ndarray。
2.但是,np.linalg.pinv()用于奇异矩阵求伪逆。

#### it is for invertible matrix
## for matrix
aMat_I = aMat.I
print('the aMat is \n{}'.format(aMat))
print('the aMat inverse is \n{}'.format(aMat_I))

## for ndarray, use the function np.linalg.inv() ,it's ok 
aArr_I = np.linalg.inv(aArr)
print('the aArr is \n{}'.format(aArr))
print('the aArr transpose is \n{}'.format(aArr_I))

#### it is for singular matrix, it is wrong
# ## for matrix
# bMat_I = bMat.I
# print('the aMat is \n{}'.format(bMat))
# print('the aMat inverse is \n{}'.format(bMat_I))

# ## for ndarray, use the function np.linalg.inv() ,it's also wrong for singular matrix
# aArr_I = np.linalg.inv(bArr)
# print('the aArr is \n{}'.format(bArr))
# print('the aArr transpose is \n{}'.format(bArr_I))

## for ndarray, use the function np.linalg.pinv() ,it's also wrong for singular matrix
## pseudo-inverse for singular matrix,Calculate the generalized inverse of a matrix using its singular-value decomposition (SVD) and including all large singular values.

bArr_I = np.linalg.pinv(bArr)
print('the aArr is \n{}'.format(bArr))
print('the aArr transpose is \n{}'.format(bArr_I))

3.4. 乘法

结论

1.将aMat * bMat用于矩阵,并将np.dot(aArr)用于ndarray。

## for matrix
matMul = aMat*bMat
print('the aMat is \n{}'.format(aMat))
print('the bMat is \n{}'.format(bMat))
print('the aMat bMat multiplication is \n{}'.format(matMul))

## for ndarray, use the function np.dot() ,it's ok 
arrMul = np.dot(aArr, bArr)
arrMul = aArr.dot(bArr)
print('the aArr is \n{}'.format(aArr))
print('the bArr is \n{}'.format(bArr))
print('the aArr bArr multiplication is \n{}'.format(arrMul))

3.5. 乘方

结论

1.将aMat * bMat用于矩阵,并将np.dot(aArr)用于ndarray。

## for matrix
matPow = aMat**2
print('the aMat is \n{}'.format(aMat))
print('the aMat power is \n{}'.format(matPow))

## for ndarray, use the function np.dot() ,it's ok 
arrPow = aArr.dot(aArr)
print('the aArr is \n{}'.format(aArr))

print('the aArr power is \n{}'.format(arrPow))

4. ndarray:按元素操作

## for multiplication
## ``*`` means element-wise multiplication, while ``@`` means matrix multiplication
print('aArr is \n{}'.format(aArr))
print('bArr is \n{}'.format(bArr))
print('element-wise multiplication is \n {}'.format(aArr*bArr))
print('matrix multiplication is \n {}'.format(aArr@bArr))

5. 更多阅读

  1. [ndarray&matrix](https://numpy.org/devdocs/user/numpy-for-matlab-users.html#array-or-matrix-which-should-i-use

  2. [reference](https://stackoverflow.com/questions/4151128/what-are-the-differences-between-numpy-arrays-and-matrices-which-one-should-i-u

6. 应用-基于最小二乘的线性回归

W^* = (X^TX)^{-1}X^TY

## for matrix
def OLS(X, y):
    """X is (sample size, feature), y is column vector"""
    X,y = np.mat(X), np.mat(y).T
    X_T = X.T
    w = (X_T*X).I * X_T * y
    
    return np.array(w)

## for ndarray
def OLS(X, y):
    """X is (sample size, feature), y is column vector"""
    y = y.reshape(-1,1)
    X_T = np.transpose(X)
    temp = np.dot(X_T, X)
    temp_inv = np.linalg.pinv(temp)
    temp = np.dot(temp, temp_inv)
    return np.dot(temp, y)

7. 注意

本人能力有限,如有问题,欢迎讨论,谢谢

相关文章

  • numpy矩阵和数组的区别

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

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

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

  • Cupy的用处概述

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

  • 创建NumPy数组(和矩阵)

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

  • 零基础入门Python数据分析之numpy最强攻略

    本文的主要学习目标: 熟练的掌握 numpy 数组相关的运算; 熟练的使用 numpy 创建矩阵; 理解矩阵转置和...

  • 处理 NumPy 矩阵和 ufunc

    处理 NumPy 矩阵和 ufunc 创建矩阵 从其它矩阵创建矩阵 通用函数(ufunc) 通用函数的方法 数组除...

  • Numpy 学习笔记

    numpy 笔记 入门基础 转化为矩阵 输出矩阵维度 输出形状 共有多少元素 创建numpy数组 创建0矩阵 创建...

  • Numpy教程(4)

    Numpy基本操作 数组与标量、数组之间的运算 数组的矩阵积(matrix product) 数组的索引和切片 数...

  • numpy 基本操作1.0

    生成数组,基本符号操作, numpy工具可用来存储和处理大型矩阵 import numpy as np ar = ...

  • Pandas

    Serise,由index和values组成。 和Numpy一纬数组,的本质区别是索引:Numpy数组通过隐式定义...

网友评论

      本文标题:numpy矩阵和数组的区别

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