来都来了,你确定不看看,使用python中的科学计算库Numpy操作数组,你一定能学废!!(图文并茂版!!!!)

Posted 温柔且上进c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来都来了,你确定不看看,使用python中的科学计算库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 时,生成的数组中会显示间距,反之不显示
dtypendarray 的数据类型
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.dtypendarray 对象的元素类型
ndarray.itemsizendarray 对象中每个元素的大小,以字节为单位
ndarray.flagsndarray 对象的内存信息
ndarray.realndarray 元素的实部
ndarray.imagndarray 元素的虚部
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聚合函数