Numpy操作数组
- Numpy库
- Numpy库的介绍
- Numpy库的安装:
- python中数组与列表对比
- 列表:
- 数组:
- 数组的创建
- 使用array方法创建数组
- 注意:
- ndmin,dtype参数的使用
- 使用arange方法创建数组
- 使用random(随机数)方法创建数组
- 其它方式创建数组
- 数组对象的属性
- 数组的切片与索引
- 改变数组的维度
- 数组的转置
- Numpy聚合函数
Numpy库
Numpy库的介绍
- NumPy(Numerical Python) 是科学计算基础库,提供大量科学计算相关功能,比如数据 统计,随机数生成等。其提供最核心类型为多维数组类型(ndarray),支持大量的维度数组 与矩阵运算,Numpy 支持向量处理 ndarray 对象,提高程序运算速度,是使用c语言编写的python库!!
Numpy库的安装:
- 基本安装:
pip install numpy
- 换源安装(豆瓣的源):
pip install numpy -i https://pypi.douban.com/simple
python中数组与列表对比
列表:
- list(列表) 是 python 的内置数据类型,list 中存放的数据类型不必相同,在 list 中保存的是数据的存放的地址,即指针,并非数据本身,在内存中并不是按照顺序存储的,并且创建时并不需要指定长度!!!
- 可以高效、方便的添加,删除,修改列表中的元素
数组:
- 数组是需要使用python中Numpy库进行创建的
- 一般都为固定长度,并且在内存中时连续存储,存储的是真正的数据
- 存储的数据的数据类型必须是相同的
数组的创建
使用array方法创建数组
- numpy 模块的 array 方法可以生成多维数组。例如,如果要生成一个二维数组,需要向 array 方法传递一个列表类型的参数。每一个列表元素是一维的 ndarray 类型数组,作为二维 数组的行。另外,通过 ndarray 类的 shape 属性可以获得数组每一维的元素个数(元组形式), 也可以通过 shape[n]形式获得每一维的元素个数,其中 n 是维度,从 0 开始
- array方法参数:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数名称 | 描述 |
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C 为行方向,F 为列方向,A 为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
注意:
- 一般在使用numpy库时,会给numpy库起个别名np,方便后续使用
- 代码演示:
- 使用array创建一维数组
# 一般在使用numpy库时,会给numpy库起个别名np
import numpy as np
# 传入列表类型
arr1 = np.array([1, 2, 3, 4])
print(arr1)
print('数组的维度:', arr1.shape)
- 使用array创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2)
print('数组的维度:', arr2.shape)
ndmin,dtype参数的使用
arr1 = np.array([1, 2, 3, 4], ndmin=3, dtype=float)
print(arr1)
print('数组的维度:', arr1.shape)
- 创建三维数组,且数组中的元素的数据类型都为float类型
使用arange方法创建数组
- 使用 arange 方法创建数值范围并返回 ndarray 对象,参数格式如下:
numpy.arange(start, stop, step, dtype)
参数名称 | 描述 |
start | 起始值,默认为 0 |
stop | 终止值(不包含) |
step | 步长,默认为 1 |
dtype | 返回 ndarray 的数据类型,如果没有提供,则会使用输入数据的类型 |
- 使用arange方法生成0-5的数组
import numpy as np
arr1 = np.arange(0, 6)
print(arr1)
print('数组的维度:', arr1.shape)
- arange方法设置起始值、终止值及步长生成数组
arr2 = np.arange(100, 120, 2)
print(arr2)
print('数组的维度:', arr2.shape)
- 起始值:100 、终止值:120、 步长:2 生成的数组中不包含终止值
- 使用arange创建二维数组
arr3 = np.array([np.arange(1, 4), np.arange(4, 7), np.arange(7, 10)])
print(arr3)
print('数组的维度:', arr3.shape)
使用random(随机数)方法创建数组
- 使用random.random生成一维数组与二维数组,该方法返回的是符合在[0.0, 1.0)范围的随机数的数组
import numpy as np
arr1 = np.random.random(size=5)
arr2 = np.random.random(size=(3, 4))
print(arr1)
print('数组的维度:', arr1.shape)
print(arr2)
print('数组的维度:', arr2.shape)
- 数组中的元素都是大于等于0,小于1的随机数
- 使用random.randin生成一维数组与二维数组,该方法返回为在自定义某个范围的随机数组成的数组(int类型)
- 该方法有三个参数 low、high、size 三个参数。默认 high 是 None,如果只有 low,那范围就是[0,low)。如果有 high,范围就是[low,high),size为需要生成数组的维度
import numpy as np
arr1 = np.random.randint(10, size=5)
arr2 = np.random.randint(5, 10, size=5)
arr3 = np.random.randint(5, 10, size=(3, 4))
print(arr1)
print('数组的维度:', arr1.shape)
print(arr2)
print('数组的维度:', arr2.shape)
print(arr3)
print('数组的维度:', arr3.shape)
- 使用random.randn创建符合标准正太分布的随机数数组
- numpy.random.randn(d0,d1,…,dn),randn 函数返回一个或一组样本,具有标准正态分布(期望为 0,方差为 1), dn 表格每个维度,返回值为指定维度的 array(数组)
**
import numpy as np
arr1 = np.random.randn(5)
arr2 = np.random.randn(2, 3)
arr3 = np.random.randn(2, 3, 4)
print(arr1)
print('数组的维度:', arr1.shape)
print(arr2)
print('数组的维度:', arr2.shape)
print(arr3)
print('数组的维度:', arr3.shape)
- 使用random.normal方法,生成指定方差与期望的随机数组
- 参数:正太分布(高斯分布)loc:期望 scale:方差 size :维度
import numpy as np
arr1 = np.random.normal(loc=2, scale=5, size=(4))
arr2 = np.random.normal(loc=2, scale=5, size=(2, 3))
arr3 = np.random.normal(loc=2, scale=5, size=(2, 3, 4))
print(arr1)
print('数组的维度:', arr1.shape)
print(arr2)
print('数组的维度:', arr2.shape)
print(arr3)
print('数组的维度:', arr3.shape)
其它方式创建数组
- ndarray 数组除了可以使用底层 ndarray 构造器来创建外,也可以通过以下几种方式来创建:
- zeros方法创建指定大小的数组,数组元素以 0 来填充
- 参数:numpy.zeros(shape, dtype = float, order = ‘C’)
import numpy as np
arr1 = np.zeros(5)
arr2 = np.zeros(5, dtype=int)
arr3 = np.zeros((2, 3, 4), dtype=int)
print(arr1)
print('数组的维度:', arr1.shape)
print(arr2)
print('数组的维度:', arr2.shape)
print(arr3)
print('数组的维度:', arr3.shape)
- numpy.ones 创建指定形状的数组,数组元素以 1 来填充
- 参数:numpy.ones(shape, dtype = None, order = ‘C’)
import numpy as np
arr1 = np.ones(5)
arr2 = np.ones(5, dtype=int)
arr3 = np.ones((2, 3, 4), dtype=int)
print(arr1)
print('数组的维度:', arr1.shape)
print(arr2)
print('数组的维度:', arr2.shape)
print(arr3)
print('数组的维度:', arr3.shape)
- numpy.empty 方法用来创建一个指定维度(shape)、数据类型(dtype)且未初始化的数组,里面的元素的值是之前内存中存储的值
- 参数:numpy.empty(shape, dtype = float, order = ‘C’)
参数名称 | 描述 |
shape | 数组形状(维度) |
dtype | 数据类型 |
order | 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存 中的存储元素的顺序 |
import numpy as np
arr1 = np.empty(5)
arr2 = np.empty(5, dtype=int)
arr3 = np.empty((2, 3, 4), dtype=int)
print(arr1)
print('数组的维度:', arr1.shape)
print(arr2)
print('数组的维度:', arr2.shape)
print(arr3)
print('数组的维度:', arr3.shape)
- linspace 方法用于创建一个一维数组,数组是一个等差数列构成的
- 参数如下:
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数名称 | 描述 |
start | 序列的起始值 |
stop | 序列的终止值,如果 endpoint参数为 true,该值包含于数列中 |
num | 要生成的等步长的样本数量,默认为 50 |
endpoint | 该值为 ture 时,数列中中包含 stop 值,反之不包含,默认是 True |
retstep | 如果为 True 时,生成的数组中会显示间距,反之不显示 |
dtype | ndarray 的数据类型 |
import numpy as np
arr1 = np.linspace(0, 10, num=5, dtype=int)
print(arr1)
print('数组的维度:', arr1.shape)
数组对象的属性
- NumPy 最重要的一个特点是其N 维数组对象 ndarray,它是一系列同类型数据的集 合,以 0 下标为开始进行集合中元素的索引。
- ndarray 对象是用于存放同类型元素的多维数组。
- ndarray 中的每个元素在内存中都有相同存储大小的区域
- ndarray 内部由以下内容组成:
一个指向数据(内存或内存映射文件中的一块数据)的指针
数据类型或 dtype,描述在数组中的固定大小值的格子
一个表示数组形状(shape)的元组,表示各维度大小的元组 - NumPy 的数组中比较重要 ndarray 对象属性有:
属性名 | 描述 |
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于多维数组,n 行 m 列 |
ndarray.size | 数组元素的总个数,相当于 .shape 中 n*m 的值 |
ndarray.dtype | ndarray 对象的元素类型 |
ndarray.itemsize | ndarray 对象中每个元素的大小,以字节为单位 |
ndarray.flags | ndarray 对象的内存信息 |
ndarray.real | ndarray 元素的实部 |
ndarray.imag | ndarray 元素的虚部 |
ndarray.data | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用此属性 |
import numpy as np
arr1 = np.arange(1, 13)
arr2 = arr1.reshape((2, 2, 3))
arr3 = np.random.randn(3, 4, 5)
print('ndim 属性'.center(20, '*'))
print('ndim:', arr1.ndim, arr2.ndim, arr3.ndim)
print('shape 属性'.center(20, '*'))
print('shape:', arr1.shape, arr2.shape, arr3.shape)
print('dtype 属性'.center(20, '*'))
print('dtype:', arr1.dtype, arr2.dtype, arr3.dtype)
print('size 属性'.center(20, '*'))
print('size:', arr1.size, arr2.size, arr3.size)
print('itemsize 属性'.center(20, '*')) # 一个字节是 8 位
print('itemsize:', arr1.itemsize, arr2.itemsize, arr3.itemsize)
数组的切片与索引
- ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作 一样
- ndarray 数组可以基于 0 - n 的下标进行索引,并设置 start, stop 及 step 参数进行,从 原数组中切割出一个新数组
- 一维数组切片和索引的使用
import numpy as np
arr1 = np.arange(1, 13)
arr2 = arr1[2::2]
arr3 = arr1[5:]
print(arr1)
print(arr2)
print(arr3)
- 二维数组根据索引值获取
import numpy as np
arr1 = np.arange(1, 13)
arr2 = arr1.reshape(3, 4)
arr3 = arr2[2]
arr4 = arr2[1][1]
print(arr2)
print('第三行', arr3)
print('第二行第二列', arr4)
- 二维数组切片的使用
- 操作方式:[对行切片,对列切片]
import numpy as np
arr1 = np.arange(1, 17).reshape(4, 4)
print(arr1)
print('第二列元素:', arr1[:, 1:2])
print('奇数行第一列:', arr1[::2, 0])
改变数组的维度
- 处理数组的一项重要工作就是改变数组的维度,包含提高数组的维度和降低数组的维 度,还包括数组的转置。Numpy 提供的大量 API 可以很轻松地完成这些数组的操作。例如, 通过 reshape 方法可以将一维数组变成二维、三维或者多维数组。通过 ravel 方法或 flatten 方法可以将多维数组变成一维数组。改变数组的维度还可以直接设置 Numpy 数组的 shape 属性(元组类型),通过 resize 方法也可以改变数组的维度
import numpy as np
arr1 = np.arange(1, 25)
print(arr1)
print('arri的维度', arr1.shape)
print('-' * 30)
# 使用reshape将一维数组变成三维数组
arr2 = arr1.reshape((2, 3, 4))
print(arr2)
print('数组arr2的维度:', arr2.shape)
print('-' * 30)
# 使用reshape将一维数组变成二维数组
arr3 = arr1.reshape(3, 8)
print(arr3)
print('数组arr3的维度:', arr3.shape)
print('-' * 30)
# 使用ravel函数将三维的arr2变成一维的数组
arr4 = np.ravel(arr2)
print(arr4)
print('数组arr3的维度:', arr4.shape)
print('-' * 30)
# 使用flatten函数将二维的arr3变成一维的数组
arr5=arr3.flatten()
print(arr5)
print('数组arr5的维度:', arr5.shape)
print('-' * 30)
数组的转置
- 使用transpose方法对数组进行转置
import numpy as np
arr1 = np.arange(1, 25).reshape(4, 6)
print(arr1)
print('arri的维度', arr1.shape)
# 二维数组的转置
arr2 = np.transpose(arr1)
print(arr2)
print('数组arr2的维度:', arr2.shape)
# 三维数组的转置
arr = np.arange(1, 25).reshape((2, 3, 4))
arr3 = np.transpose(arr, [1, 0, 2])
print(arr3)
print('数组arr3的维度:', arr3.shape)
Numpy聚合函数
- NumPy 提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差 和方差等。 具体如下:
函数名 | 操作说明 |
np.sum() | 求和 |
np.prod() | 所有元素相乘 |
np.mean() | 平均值 |
np.std() | 标准差 |
np.var() | 方差 |
np.median() | 中位数 |
np.power() | 幂运算 |
np.sqrt() | 开方 |
np.min() | 最小值 |
np.max() | 最大值 |
np.argmin() | 最小值的下标 |
np.argmax() | 最大值的下标 |
np.inf | 无穷大 |
np.exp(10 | 以 e 为底的指数 |
np.log(10) | 对数 |