Python常用库Numpy进行矩阵运算详解

Numpy支持大量的维度数组和矩阵运算,对数组运算提供了大量的数学函数库!

Numpy比Python列表更具优势,其中一个优势便是速度。在对大型数组执行操作时,Numpy的速度比Python列表的速度快了好几百。因为Numpy数组本身能节省内存,并且Numpy在执行算术、统计和线性代数运算时采用了优化算法。

Numpy的另一个强大功能是具有可以表示向量和矩阵的多维数组数据结构。Numpy对矩阵运算进行了优化,使我们能够高效地执行线性代数运算,使其非常适合解决机器学习问题。

与Python列表相比,Numpy具有的另一个强大优势是具有大量优化的内置数学函数。这些函数使你能够非常快速地进行各种复杂的数学计算,并且用到很少代码(无需使用复杂的循环),使程序更容易读懂和理解。

注:在ndarray结构中,里面元素必须是同一类型的,如果不是,会自动的向下进行。

Numpy简单创建数组

a = [1, 2, 3]
b = np.array(a)
c = np.array([[0, 1, 2, 10],
    [12, 13, 100, 101],
    [102, 110, 112, 113]], int)
print(c)
print(b)

创建数值为1的数组

Numpy.ones(参数 1:shape,数组的形状;参数 2:dtype, 数值类型)

array_one = np.ones([10, 10], dtype=np.int)
 print(array_one)

创建数值为0的数组

Numpy.zeros(参数 1:shape,数组的形状;参数 2:dtype, 数值类型)

array_zero = np.zeros([10, 9], dtype=np.float)
 print(array_zero)

创建指定数值的数组

Numpy.full(参数 1:shape,数组的形状; 参数 2:constant value,数组填充的常数值;参数 3:dtype, 数值类型)

 array_full = np.full((2, 3), 5)
 print(array_full)

创建单位矩阵

Numpy.eye(参数 1:N,方阵的维度)

 array_eye = np.eye(5)
 print(array_eye)

创建对角矩阵

Numpy.diag(参数1:v,主对角线数值,参数 2:k,对角线元素):K = 0表示主对角线,k>0的值选择在主对角线之上的对角线中的元素,k<0的值选择在主对角线之下的对角线中的元素

array_diag = np.diag([10, 20, 30, 40])
 print(array_diag)

Numpy查看数组属性

数组元素个数:b.size 或 np.size()

数组形状:b.shape 或 np.shape()

数组维度:b.ndim

数组元素类型:b.dtype

# 数组元素个数:3
print(b.size)
# 数组形状:(3,)
print(b.shape)
# 数组维度:1
print(b.ndim)
# 数组元素类型:int32
print(b.dtype)

矩阵第一维的长度:shape[0] # 行

矩阵第二维的长度:shape[1] # 列

.......

 array_rand = np.random.rand(10, 10, 4)
 print(array_rand)
 print(array_rand.ndim)
 print(array_rand.shape[0])
 print(array_rand.shape[1])
 print(array_rand.shape[2])

Numpy创建随机数组(np.random)

均匀分布

创建指定形状的数组,数值范围在0~1之间

array_rand = np.random.rand(10, 10, 4)
 print(array_rand)
 print(array_rand.ndim)

创建指定范围内的一个数:Numpy.random.uniform(low, high, size=None)

 array_uniform = np.random.uniform(0, 100, size=5)
print(array_uniform)

创建指定范围的一个整数:Numpy.random.randint(low, high, size=None)

array_int = np.random.randint(0, 100, size=3)
print(array_int)
print(array_int.size)

Numpy.arange()和Numpy.linspace()函数也可以均匀分布

Numpy.arange(start, stop, step):创建一个秩为1的array,其中包含位于半开区间[start, stop)内并均匀分布的值,step表示两个相邻值之间的差。

Numpy.linspace(start, stop, N):创建N个在闭区间[start, stop]内均匀分布的值。

 X = np.arange(1, 5, 2, dtype=np.int)
 print(X)
 y = np.linspace(1, 5, 3)
 print(y)

正态分布

创建给定均值、标准差、维度的正态分布:Numpy.random.normal(loc, scale, size)

 # 正态生成4行5列的二位数组
 array_normal = np.random.normal(loc=1.75, scale=0.1, size=[4, 5])
 print(array_normal)
 print(array_normal.ndim)

Numpy数组操作

数组的索引

array[start : end]

array[start:]

array[:end]

布尔型索引:array[array>10 & array<20]

 # 截取第0至第3行,第2至第4列(从第0行第0列算起)
 after_array = array_normal[:3, 2:4]
 print(after_array)

数组的复制

Numpy.copy(参数 1:数组):创建给定array的一个副本,还可当做方法用。

after_array = array_normal[:3, 2:4].copy()
copy_array = np.copy(array_normal[:, 2:4])

Numpy.sort(参数 1:a,数组;参数 2:axis=0/1,0表示行1表示列):np.sort()作为函数使用时,不更改被排序的原始array;array.sort()作为方法使用时,会对原始array修改为排序后数组array

 # 整体排序
 np.sort(array_normal)
 # 仅行排序
 np.sort(array_normal, axis=0)
 # 仅列排序
 np.sort(array_normal, axis=1)

数组唯一元素

Numpy.unique(参数 1:a,数组;参数 2:return_index=True/False,新列表元素在旧列表中的位置;参数 3:return_inverse=True/False,旧列表元素在新列表中的位置;参数 4:return_counts,元素的数量;参数 5:axis=0/1,0表示行1表示列):查找array中的唯一元素。

 print("提取唯一元素", np.unique(array_normal))
 print("提取唯一元素", np.unique(array_normal, return_index=True))
 print("提取唯一元素", np.unique(array_normal, return_counts=True))
 print("提取唯一元素", np.unique(array_normal, return_index=True, return_inverse=True, axis=0))

数组的改变

数组转置

array_normal.T

reshape():把指定的数组改变形状,但是元素个数不变;有返回值,即不对原始多维数组进行修改

c = np.array([[[0, 1, 2],
    [10, 12, 13]],
    [[100, 101, 102],
    [110, 112, 113]]])
"""
[[[ 0 1]
 [ 2 10]]

 [[ 12 13]
 [100 101]]

 [[102 110]
 [112 113]]]
"""
print(c.reshape(3, 2, 2))
"""
[[ 0 1 2 10]
 [ 12 13 100 101]
 [102 110 112 113]]
"""
# 某一维指定为-1时,自动计算维度
print(c.reshape(3, -1))
"""[[[ 0 1]
 [ 2 10]
 [ 12 13]]

 [[100 101]
 [102 110]
 [112 113]]]"""
print(c.reshape(2, -1, 2))

resize():把指定的数组改变形状,但是元素个数可变,不足补0;无返回值,即对原始多维数组进行修改

a = np.array([[[0, 1, 2],
    [10, 12, 13]],
    [[100, 101, 102],
    [110, 112, 113]]])
b = np.array([[[0, 1, 2],
    [10, 12, 13]],
    [[100, 101, 102],
    [110, 112, 113]]])
'''[[0]
 [1]
 [2]]'''
a.resize((3, 1))
'''[[ 0 1 2 10 12]
 [ 13 100 101 102 110]
 [112 113 0 0 0]]'''
b.resize((3, 5))
print(a)
print(b)

*Numpy计算

条件运算

Numpy.where(condition, x, y):三目运算满足condition,为x;不满足condition,则为y

 score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
 # 如果数值小于80,替换为0,如果大于等于80,替换为90
 re_score = np.where(score < 80, 0, 90)
 print(re_score)

]统计运算

指定轴最大值:amax(参数1:数组;参数2:axis=0/1,0表示行1表示列)

# 求整个矩阵的最大值
result = np.amax(score)
print(result)
# 求每一列的最大值(0表示行)
result = np.amax(score, axis=0)
print(result)
# 求每一行的最大值(1表示列)
result = np.amax(score, axis=1)
print(result)

指定轴最小值:amin(参数1:数组;参数2:axis=0/1,0表示行1表示列)

# 求整个矩阵的最小值
result = np.amin(score)
print(result)
# 求每一列的最小值(0表示行)
result = np.amin(score, axis=0)
print(result)
# 求每一行的最小值(1表示列)
result = np.amin(score, axis=1)
print(result)

指定轴平均值:mean(参数1:数组;参数2:axis=0/1,0表示行1表示列;参数3:dtype,输出数据类型)

# 求整个矩阵的平均值
result = np.mean(score, dtype=np.int)
print(result)
# 求每一列的平均值(0表示行)
result = np.mean(score, axis=0)
print(result)
# 求每一行的平均值(1表示列)
result = np.mean(score, axis=1)
print(result)

指定轴方差:std(参数1:数组;参数2:axis=0/1,0表示行1表示列;参数3:dtype,输出数据类型)

# 求整个矩阵的方差
result = np.std(score)
print(result)
# 求每一列的方差(0表示列)
result = np.std(score, axis=0)
print(result)
# 求每一行的方差(1表示行)
result = np.std(score, axis=1)
print(result)

类似的,求和:Numpy.sum(),求中值:Numpy.median

数组运算

数组与数的运算(加、减、乘、除、取整、取模)

# 循环数组行和列,每一个数值都加5
score[:, :] = score[:, :]+5
print(score)
# 循环数组行和列,每一个数值都减5
score[:, :] = score[:, :]-5
print(score)
# 循环数组行和列,每一个数值都乘以5
score[:, :] = score[:, :]*5
print(score)
# 循环数组行和列,每一个数值都除以5
score[:, :] = score[:, :]/5
print(score)
# 循环数组行和列,每一个数值除以5取整
score[:, :] = score[:, :] // 5
print(score)
# 循环数组行和列,每一个数值除以5取模
score[:, :] = score[:, :] % 5
print(score)

数组间运算(加、减、乘、除),前提是两个数组的shape一样

加:“+”或者np.add(a, b)  减:“-”或者np.subtract(a, b)  

乘:“*”或者np.multiply(a, b)  除:“/”或者np.divide(a, b)

 c = score + score
 d = score - score
 e = score * score
 # 分母数组保证每个数值不能为0
 b = score / score

Numpy.intersect1d(参数 1:数组a;参数 2:数组b):查找两个数组中的相同元素

Numpy.setdiff1d(参数 1:数组a;参数 2:数组b):查找在数组a中不在数组b中的元素

Numpy.union1d(参数 1:数组a;参数 2:数组b):查找两个数组的并集元素

矩阵运算(一种特殊的二维数组)

计算规则

(M行,N列)*(N行,Z列)=(M行,Z列)

 st_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
 # 平时成绩占40% 期末成绩占60%, 计算结果
 q = np.array([[0.4], [0.6]])
 result = np.dot(st_score, q)
 print(result)

矩阵拼接

矩阵垂直拼接(前提两个两个矩阵列数相同,行数随意):vstack(参数:tuple)

v1 = [[0, 1, 2, 3, 4, 5],
  [6, 7, 8, 9, 10, 11]]
v2 = [[12, 13, 14, 15, 16, 17],
  [18, 19, 20, 21, 22, 23],
  [18, 19, 20, 21, 22, 23]]
result = np.vstack((v1, v2))
print(result)

矩阵水平拼接(前提两个两个矩阵行数相同,列数随意):hstack(参数:tuple)

 v1 = [[0, 1, 2, 3, 4, 5],
  [6, 7, 8, 9, 10, 11]]
 v2 = [[12, 13, 14, 15, 16, 17],
  [18, 19, 20, 21, 22, 23]]
 result = np.hstack((v1, v2))
 print(result)

矩阵删除:Numpy.delete(参数 1:a,数组;参数 2:elements,删除的对象;参数 3:axis=0/1)

OriginalY = np.array([[1, 2, 3],
      [4, 5, 6],
      [7, 8, 9]])
 print(np.delete(OriginalY, [0, 2]))
 print(np.delete(OriginalY, [0, 2], axis=0))
 print(np.delete(OriginalY, [0, 2], axis=1))

矩阵添加:Numpy.append(参数 1:array,数组;参数 2: elements,添加元素;参数 3: axis=0/1)

OriginalY = np.array([[1, 2, 3],
      [4, 5, 6],
      [7, 8, 9]])
# 末尾添加元素
print(np.append(OriginalY, [0, 2]))
# 最后一行添加一行
print(np.append(OriginalY, [[0, 2, 11]], axis=0))
# 最后一列添加一列(注意添加元素格式)
print(np.append(OriginalY, [[0], [2], [11]], axis=1))

矩阵插入:Numpy.insert(参数 1:array,数组;参数 2:index,插入位置索引;参数 3: elements,添加元素;参数 4: axis=0/1)

OriginalY = np.array([[1, 2, 3],
      [4, 5, 6],
      [7, 8, 9]])
print(np.insert(OriginalY, 1, [11, 12, 10]))
print(np.insert(OriginalY, 1, [[11, 12, 10]], axis=0))
# 在列索引1的位置插入(注意元素格式,跟添加格式不同)
print(np.insert(OriginalY, 1, [[11, 12, 10]], axis=1))

文件加载

np.loadtxt(fname,dtype,comments='#',delimiter=None,skiprows=0,usecols=None)

fname:读取的文件、文件名

dtype:数据类型

comments:注释

delimiter:分隔符,默认是空格

skiprows:跳过前几行读取,默认是0

usecols:读取哪些列,usecols=(1, 2, 5)读取第1,2,5列,默认所有列

到此这篇关于Python常用库Numpy进行矩阵运算详解的文章就介绍到这了,更多相关Python Numpy 矩阵运算内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-07-20

python numpy库np.percentile用法说明

在python中计算一个多维数组的任意百分比分位数,此处的百分位是从小到大排列,只需用np.percentile即可-- a = range(1,101) #求取a数列第90%分位的数值 np.percentile(a, 90) Out[5]: 90.10000000000001 a = range(101,1,-1) #百分位是从小到大排列 np.percentile(a, 90) Out[7]: 91.10000000000001 详看官方文档 numpy.percentile Parame

Python的numpy库下的几个小函数的用法(小结)

numpy库是Python进行数据分析和矩阵运算的一个非常重要的库,可以说numpy让Python有了matlab的味道 本文主要介绍几个numpy库下的小函数. 1.mat函数 mat函数可以将目标数据的类型转换为矩阵(matrix) import numpy as np >>a=[[1,2,3,], [3,2,1]] >>type(a) >>list >>myMat=np.mat(a) >>myMat >>matrix([[1,2

Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算

使用numpy可以做很多事情,在这篇文章中简单介绍一下如何使用numpy进行方差/标准方差/样本标准方差/协方差的计算. variance: 方差 方差(Variance)是概率论中最基础的概念之一,它是由统计学天才罗纳德·费雪1918年最早所提出.用于衡量数据离散程度,因为它能体现变量与其数学期望(均值)之间的偏离程度.具有相同均值的数据,而标准差可能不同,而通过标准差的大小则能更好地反映出数据的偏离度. 计算:一组数据1,2,3,4,其方差应该是多少? 计算如下: 均值=(1+2+3+4)/

python 的numpy库中的mean()函数用法介绍

1. mean() 函数定义: numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<class numpy._globals._NoValue at 0x40b6a26c>)[source] Compute the arithmetic mean along the specified axis. Returns the average of the array elements. The average is taken over

python numpy库linspace相同间隔采样的实现

linspace可以用来实现相同间隔的采样: numpy.linspace(start,stop,num=50,endpoint=True,retstep=False, dtype=None) 返回num均匀分布的样本,在[start, stop]. Parameters(参数): start : scalar(标量) The starting value of the sequence(序列的起始点). stop : scalar 序列的结束点,除非endpoint被设置为False,在这种情

Python Numpy库安装与基本操作示例

本文实例讲述了Python Numpy库安装与基本操作.分享给大家供大家参考,具体如下: 概述 NumPy(Numeric Python)扩展包提供了数组功能,以及对数据进行快速处理的函数. NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用. 安装 通过pip安装numpy pip install numpy Numpy基本操作 >>> import numpy as np #一般以np作为numpy的别名 >>&

python常用库之NumPy和sklearn入门

Numpy 和 scikit-learn 都是python常用的第三方库.numpy库可以用来存储和处理大型矩阵,并且在一定程度上弥补了python在运算效率上的不足,正是因为numpy的存在使得python成为数值计算领域的一大利器:sklearn是python著名的机器学习库,它其中封装了大量的机器学习算法,内置了大量的公开数据集,并且拥有完善的文档,因此成为目前最受欢迎的机器学习学习与实践的工具. 1. NumPy库 首先导入Numpy库 import numpy as np 1.1 nu

Python Numpy库常见用法入门教程

本文实例讲述了Python Numpy库常见用法.分享给大家供大家参考,具体如下: 1.简介 Numpy是一个常用的Python科学技术库,通过它可以快速对数组进行操作,包括形状操作.排序.选择.输入输出.离散傅立叶变换.基本线性代数,基本统计运算和随机模拟等.许多Python库和科学计算的软件包都使用Numpy数组作为操作对象,或者将传入的Python数组转化为Numpy数组,因此在Python中操作数据离不开Numpy. Numpy的核心是ndarray对象,由Python的n维数组封装而来

Python中矩阵库Numpy基本操作详解

NumPy是一个关于矩阵运算的库,熟悉Matlab的都应该清楚,这个库就是让python能够进行矩阵话的操作,而不用去写循环操作. 下面对numpy中的操作进行总结. numpy包含两种基本的数据类型:数组和矩阵. 数组(Arrays) >>> from numpy import * >>> a1=array([1,1,1]) #定义一个数组 >>> a2=array([2,2,2]) >>> a1+a2 #对于元素相加 array(

Python Numpy库datetime类型的处理详解

前言 关于时间的处理,Python中自带的处理时间的模块就有time .datetime.calendar,另外还有扩展的第三方库,如dateutil等等.通过这些途径可以随心所欲地用Python去处理时间.当我们用NumPy库做数据分析时,如何转换时间呢? 在NumPy 1.7版本开始,它的核心数组(ndarray)对象支持datetime相关功能,由于'datetime'这个数据类型名称已经在Python自带的datetime模块中使用了, NumPy中时间数据的类型称为'datetime6

python爬虫库scrapy简单使用实例详解

最近因为项目需求,需要写个爬虫爬取一些题库.在这之前爬虫我都是用node或者php写的.一直听说python写爬虫有一手,便入手了python的爬虫框架scrapy. 下面简单的介绍一下scrapy的目录结构与使用: 首先我们得安装scrapy框架 pip install scrapy 接着使用scrapy命令创建一个爬虫项目: scrapy startproject questions 相关文件简介: scrapy.cfg: 项目的配置文件 questions/: 该项目的python模块.之

Python numpy多维数组实现原理详解

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.今天就针对多维数组展开来写博客numpy其一部分功能如下: 1.ndarray,是具有矢量算术运算且节省空间的多维数组. 2.可以用于对整组的数据快速进行运算的辨准数学函数. 3.能够用于读写磁盘数据的工具以及用于操作系统内存映射的工具. NumPy它本身其实没有提供很高级别的数据分析功能,NumPy之于数值计算特别重要的原因之一,就是因为

Python BS4库的安装与使用详解

Beautiful Soup 库一般被称为bs4库,支持Python3,是我们写爬虫非常好的第三方库.因用起来十分的简便流畅.所以也被人叫做"美味汤".目前bs4库的最新版本是4.60.下文会介绍该库的最基本的使用,具体详细的细节还是要看:[官方文档](Beautiful Soup Documentation) bs4库的安装 Python的强大之处就在于他作为一个开源的语言,有着许多的开发者为之开发第三方库,这样我们开发者在想要实现某一个功能的时候,只要专心实现特定的功能,其他细节与

Python随机函数库random的使用方法详解

前言 众所周知,python拥有丰富的内置库,还支持众多的第三方库,被称为胶水语言,随机函数库random,就是python自带的标准库,他的用法极为广泛,除了生成比较简单的随机数外,还有很多功能.使用random库: import random random库主要函数: 函数名 说明 用法 random() 生成一个0~1之间的随机浮点数,范围 0 <= n < 1.0 random.random() uniform(a,b) 返回a, b之间的随机浮点数,范围[a, b]或[a, b),

Java8新特性时间日期库DateTime API及示例详解

Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API来处理日期相关操作,这篇文章你一定不要错过.来刷新你的知识库吧! 背景 Java对日期.日历及时间的处理一直以来都饱受诟病,比如java.util.Date和java.util.Calendar类易用性差,不支持时区,非线程安全:还有用于格式化日期的类DateFormat也是非线程安全的等问题. J

Python标准库之Sys模块使用详解

sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称. 使用sys模块获得脚本的参数 复制代码 代码如下: print "script name is", sys.argv[0]        # 使用sys.argv[0]采集脚本名称 if len(sys.argv) > 1:     print "there are",

对python xlrd读取datetime类型数据的方法详解

使用xlrd读取出来的时间字段是类似41410.5083333的浮点数,在使用时需要转换成对应的datetime类型,下面代码是转换的方法: 首先需要引入xldate_as_tuple函数 from xlrd import xldate_as_tuple 使用方法如下: #d是从excel中读取出来的浮点数 xldate_as_tuple(d,0) xldate_as_tuple第二个参数有两种取值,0或者1,0是以1900-01-01为基准的日期,而1是1904-01-01为基准的日期.该函数