Numpy库是Python中的一个科学计算库,本文主要介绍了ndarray的基本操作、 ndarray运算等各种Numpy库的超详细教程,需要的朋友可以参考下
1、Numpy概述
1.1 概念
Python本身含有列表和数组,但对于大数据来说,这些结构是有很多不足的。由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。对于数值运算来说这种 结构比较浪费内存和CPU资源。至于数组对象,它可以直接保存 数值,和C语言的一维数组比较类似。但是由于它不支持多维,在上面的函数也不多,因此也不适合做数值运算。Numpy提供了两种基本的对象:ndarray(N-dimensional Array Object)和 ufunc(Universal Function Object)。ndarray是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。
1.2 功能
- 创建n维数组(矩阵)
- 对数组进行函数运算,使用函数计算十分快速,节省了大量的时间,且不需要编写循环,十分方便
- 数值积分、线性代数运算、傅里叶变换
- ndarray快速节省空间的多维数组,提供数组化的算术运算和高级的 广播功能。
1.3 对象
- NumPy中的核心对象是ndarray
- ndarray可以看成数组,存放同类元素
- NumPy里面所有的函数都是围绕ndarray展开的

ndarray 内部由以下内容组成:
• 一个指向数据(内存或内存映射文件中的一块数据)的指针。
• 数据类型或 dtype,描述在数组中的固定大小值的格子。
• 一个表示数组形状(shape)的元组,表示各维度大小的元组。形状为(row×col)
1.4 数据类型
numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和C语言的数据类型对应上主要包括int8、int16、int32、int64、uint8、uint16、uint32、uint64、float16、float32、float64
1.5 数组属性
属性 |
说明 |
ndarray.ndim |
秩,即轴的数量或维度的数量 |
ndarray.shape |
数组的维度(n×m),对于矩阵,n 行 m 列 |
ndarray.size |
数组元素的总个数,相当于 .shape 中 n*m 的值 |
ndarray.dtype |
ndarray 对象的元素类型 |
ndarray.itemsize |
ndarray 对象中每个元素的大小,以字节为单位 |
ndarray.flags |
ndarray 对象的内存信息 |
ndarray.real |
ndarray元素的实部 |
ndarray.imag |
ndarray元素的虚部 |
ndarray.data |
包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。 |
2、Numpy数组操作
2.1 Numpy创建
2.1.1 利用列表生成数组
1 2 3 4 5 6 |
import numpy as np lst = [ 1 , 2 , 3 , 4 ] nd1 = np.array(lst) print (nd1, type (nd1)) #[1 2 3 4] |
2.1.2 利用random模块生成数组
下面是random模块的一些常用函数
::: hljs-center

使用如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import numpy as np #0到1标准正态分布 arr1 = np.random.randn( 3 , 3 ) #0到1均匀分布 arr2 = np.random.rand( 3 , 3 ) #均匀分布的随机数(浮点数),前两个参数表示随机数的范围,第三个表示生成随机数的个数 arr3 = np.random.uniform( 0 , 10 , 2 ) #均匀分布的随机数(整数),前两个参数表示随机数的范围,第三个表示生成随机数的个数 arr4 = np.random.randint( 0 , 10 , 3 ) print (f 'arr1 : {arr1}\narr2 : {arr2}\narr3 : {arr3}\narr4 : {arr4}' ) out : # arr1 : [[-0.31637952 -0.08258995 1.43866984] # [-0.11216775 0.43881134 0.11745847] # [-1.1770306 -0.97657465 2.2368878 ]] # arr2 : [[0.16350611 0.4467384 0.9465067 ] # [0.1882318 0.40261184 0.93577701] # [0.56243911 0.69179631 0.83407725]] # arr3 : [4.41402883 6.03259052] # arr4 : [9 7 7] |
如果想使每次生成的数据相同,可以指定一个随机种子
1 2 3 4 5 |
import numpy as np np.random.seed( 123 ) arr = np.random.rand( 2 , 3 ) #[[0.69646919 0.28613933 0.22685145] [0.55131477 0.71946897 0.42310646]] #打乱数组 np.random.shuffle(arr) #[[0.55131477 0.71946897 0.42310646] [0.69646919 0.28613933 0.22685145]] |
2.1.3 创建特定形状数组
主要有如下几种:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import numpy as np #未初始化的数组 arr1 = np.empty(( 2 , 3 )) #数组元素以 0 来填充 arr2 = np.zeros(( 2 , 3 )) #数组元素以 1 来填充 arr3 = np.ones(( 2 , 3 )) #数组以指定的数来进行填充,这里举例3 arr4 = np.full(( 2 , 3 ), 3 ) #生成单位,对角线上元素为 1,其他为0 arr5 = np.eye( 2 ) #二维矩阵输出矩阵对角线的元素,一维矩阵形成一个以一维数组为对角线元素的矩阵 arr6 = np.diag(np.array([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]])) |
在创建给定长度的等差数列时,要注意的是np.linspace形成的数组一定包括范围的首位两个元素,则步长为(end - start) / (length - 1)。而np.arange是自己指定的步长(默认为1)也就意味着形成的数组不一定包括末尾数
1 2 |
arr7 = np.linspace( 0 , 1 , 4 ) #out : array([0. , 0.33333333, 0.66666667, 1. ]) arr8 = np.arange( 0 , 9 , 2 ) #out : array([0, 2, 4, 6, 8]) |
2.2 索引和切片
Numpy可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样,设置start, stop 及 step 参数。
2.2.1 元素表示
Numpy数组的下标表示与list是一样的,对于矩阵来说,要注意中括号里要用逗号将行和列的表示进行分隔。基本的表示方法如下图,左边为表达式,右边为表达式获取的元 素。注意,不同的边界,表示不同的表达式。

例子:
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
a[0] : 指的是第一行
a[1, 2] 或者 a[1][2] : 全下标定位单个元素,在a中表示7这个元素
2.2.2 切片表示
若a = np.arange(10),b = a[2 : 7 : 2]则表示从索引 2 开始到索引 7 停止,间隔为 2,即b为[2, 4, 6]。此外也可以通过切片操作来对元素进行修改,如:
1 2 3 |
a = np.array([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]]) a[ 0 , 1 : 3 ] = 100 , 101 #a[0 , 1 : 3]表示第一行的第二列和第二列即[2, 3] a #out : array([[ 1, 100, 101], [ 4, 5, 6], [ 7, 8, 9]]) |
2.2.3 多维数组的切片
NumPy的多维数组和一维数组类似。多维数组有多个轴。从内到外分别是第0轴,第1轴,第2轴......切片后的数据与切片前的数据共享原数组的储存空间

当然,切片操作是针对我们想要获取的数据是连续的,如果我们想要获取离散数据就不能使用切片的方法,再者就是我们不能一个一个来进行提取,Numpy有一种很方便的方法可以获得离散数据。即下面
1 2 3 4 5 |
x = np.array([[ 0 , 1 , 2 ],[ 3 , 4 , 5 ],[ 6 , 7 , 8 ],[ 9 , 10 , 11 ]]) rows = np.array( [ [ 0 , 0 ],[ 3 , 3 ] ] ) #表示第1、4行 cols = np.array( [ [ 0 , 2 ],[ 0 , 2 ] ] ) #表示第1、3列 y = x[rows,cols] y # out : array([[ 0, 2], [ 9, 11]]) |
2.2.4 布尔索引
顾名思义,通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
1 2 3 4 |
x = np.array([[ 0 , 1 , 2 ],[ 3 , 4 , 5 ],[ 6 , 7 , 8 ],[ 9 , 10 , 11 ]]) print (x[x > 5 ]) # out : [ 6 7 8 9 10 11] b = x > 5 b # 打印布尔运算的结果 |

2.2.5 元素查找定位
Numpy库中提供了where函数来查找满足条件元素的索引,表示如下:
- np.where(condition, x, y): 满足条件(condition),输出x,不满足输出y
- np.where(condition): 输出满足条件 (即非0) 元素的坐标
1 2 3 |
a = np.array([ 2 , 4 , 6 , 8 , 10 , 3 ]).reshape( 2 , 3 ) c = np.where(a > 5 ) # 返回索引 out : (array([0, 1, 1], dtype=int64), array([2, 0, 1], dtype=int64)) a[c] # 获得元素 |
2.2.6 元素删除
np.delete(arr, obj, axis=None)
- 第一个参数:要处理的矩阵,
- 第二个参数,处理的位置,下标
- 第三个参数,0表示按照行删除,1表示按照列删除,默认为0
- 返回值为删除后的剩余元素构成的矩阵
1 2 |
arr = np.array([[ 1 , 2 , 3 , 4 ], [ 5 , 6 , 7 , 8 ], [ 9 , 10 , 11 , 12 ]]) np.delete(arr, [ 1 ], 0 ) # 表示删除第二行 |
转自:https://www.weidianyuedu.com