NumPy

NumPy

NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。

目录
一、NumPy基础
二、NumPy数组
1.创建数组(从Python列表创建数组)
2.快速创建数组(通过函数创建数组)
3.创建随机数组
4.数组属性
5.NumPy数据类型
6.数据类型转换
7.数组索引
8.花哨索引
9.数组重新塑形
10.数组拼接
11.数组分裂
三、Numpy运算
1.算术运算
2.统计运算
3.数据选取
4.广播
5.矩阵运算
6.轴变换
四、数组的排序
五、NumPy结构化数组

一、NumPy基础

1.安装NumPy

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ numpy

2.库导入

import numpy as np

二、NumPy数组

NumPy提供了一个N维数组的类型,即ndarray,它描述了相同类型的“items”的集合。 可以使用例如整数的N来索引项目(items)。

1.创建ndarray数组(从Python列表创建数组)

从Python列表创建

np.array(序列对象)

返回一个ndarray对象。
注意:ndarray中所有元素数据类型一致。
如果传入了拥有不同类型元素的列表,array方法会尝试自动转换。

2.快速创建数组(通过函数创建数组)

  • 1.创建数值为浮点0的数组
# 创建n_x维向量
dw = np.zeros((n_x,1))
# 创建m*n矩阵
matrix = np.zeros((m,n))
# 创建m*n*k张量
tensor = np.zeros((m,n,k))
  • 2.创建数值为浮点1的数组
np.ones()

示例:


NumPy_第1张图片
  • 3.创建空数组(数据随机)
np.empty()
  • 4.创建指定值的数组
np.full(形状, 填充值)

示例:


NumPy_第2张图片
  • 5.创建单位矩阵
np.eye(阶数)
  • 6.创建等差数列
np.arange(start, stop, step)
np.linspace(start, stop, num)

3.创建随机数组

伪随机数种子设置

np.random.seed(0)
  • 1.均匀分布
# 创建指定形状的数组(数值范围在0至1之间)
np.random.rand(形状)
np.random.random((形状))

# 创建指定范围内的一个数
np.random.uniform(a,b)
# 创建指定范围内的一个整数
np.random.randint(a,b)

示例:


NumPy_第3张图片
  • 2.正态分布(高斯分布)
np.random.normal(loc=0.0, scale=1.0, size=None)

loc:μ,概率分布的均值。
scale:σ,概率分布的标准差。对应于分布的宽度,越大越矮胖,越小越瘦高。
size:返回数组的形状(标量、向量、矩阵、张量)。

快速生成高斯分布数组:

np.random.randn(形状)

4.数组属性

属性 说明
.size 数组元素个数
.shape 数组形状
.ndim 数组维度
.dtype 数组元素类型
.itemsize 每个元素的大小(单位:bytes)
.nbytes 整个数组的大小(单位:bytes)

5.NumPy数据类型

数据类型 类型代码 说明
int8 uint8 i1 u1 有符号/无符号8位(1字节)整型
int16 uint16 i2 u2 有符号/无符号16位(2字节)整型
int32 uint32 i3 u3 有符号/无符号32位(4字节)整型
float16 f2 半精度浮点型
float32 f4或f 标准单精度浮点型
float64 f8或d 双精度浮点型
bool ? 布尔类型
object O Python对象
unicode_ U 固定长度Unicode类型(字符串类型)

6.数据类型转换

new_array = origin_array.astype(np.数据类型)

注意:浮点型转整型会直接截断小数部分。
注意:astype是返回一个原数组的拷贝,而非对原数组做更改。

  • 含数字和小数点字符串可以转换为浮点型,不能直接转换为整型(可先转换为浮点型,再转换为整型)。
  • 仅含数字的字符串可以直接转换为整型。
    示例:


    NumPy_第4张图片

7.数组索引

(1)下标访问

可通过下标访问数组元素。

(2)切片

与python语法一致

array[start: stop: step]

多为数组切片

array[start: stop: step, start: stop: step, ......]

注意:通过切片选取后产生的数组是原数组的视图,而非数组的副本。
警告:修改切片会导致原始数组也被修改。

(3)拷贝副本

array_copy = array.copy()

8.花式索引(花哨索引)

花式索引(花哨索引):利用整数数组进行索引

(1)花哨索引

array[索引数组]

注意:利用花哨索引选出来的结果,与索引数组的形状保持一致,而非与被索引的数组保持一致。
示例:


NumPy_第5张图片
  • 花哨索引也适用多维索引


    NumPy_第6张图片

    等效于选取选取x[0, 2], x[1, 1], x[2, 3]

(2)组合索引

组合索引:花哨索引和其他索引方式组合起来的索引方式

①花哨索引与普通索引组合使用

NumPy_第7张图片

x[2,[0, 1, 2]]等效于选择x[2,0], x[2,1], x[2,2]

②花哨索引与切片组合使用

NumPy_第8张图片

③花哨索引与掩码组合使用

NumPy_第9张图片

选择第一列和第三列

(3)使用花哨索引修改值

NumPy_第10张图片

x[[0, 0]] = [4, 6]等效于先执行x[0] = 4,后执行x[0] = 6

(4)使用花哨索引进行累加

at()函数

np.通用函数.at(被操作数, 操作数, 循环次数)

示例:


NumPy_第11张图片

9.数组重新塑形

(1)reshape

arr.reshape((形状))

(2)newaxis

# 新建行轴
array[np.newaxis, :]
# 新建列轴
array[:, np.newaxis]

10.数组拼接

可以一次拼接两个以上的数组

np.concatenate([数组1, 数组2, 数组3, ......], axis=拼接轴)

简化版拼接函数
1.np.vstack():垂直栈
2.np.hstack():水平栈


NumPy_第12张图片

11.数组分裂

np.split(array, [分割点1, 分割点2, ......])

示例:



简化版分割函数
1.np.vsplit():垂直分割
2.np.hsplit():水平分割
示例:


NumPy_第13张图片

三、Numpy运算

1.算术运算

直接对ndarray对象进行算术运算操作,相当于对对象中的每个元素进行该算术运算操作。

运算符 通用函数 描述
+ np.add 加法运算
- np.substract 减法运算
- np.negative 负数运算
* np.multiply 乘法运算
/ np.divide 除法运算
// np.floor_divide 整除
** np.power 指数运算
% np.mod 模运算

示例:

matrix = np.random.normal(0,1,(3,3))
print(matrix)
print(matrix + 10)
print(matrix > 0.5)
NumPy_第14张图片
运行结果

2.统计运算(算术聚合运算)

np.通用函数.reduce()
np.聚合函数(数组, axis=聚合维数)
函数名称 NaN安全版本 描述
np.sum np.nansum 计算所有元素的和
np.prod np.nanprod 计算所有元素的积
np.mean np.nanmean 计算所有元素的均值
np.std np.nanstd 计算所有元素的标准差
np.var np.nanvar 计算所有元素的方差
np.min np.nanmin 求所有元素的最小值
np.max np.nanmax 求所有元素的最大值
np.argmin np.nanargmin 求最小值索引
np.argmax np.nanargmax 求最大值索引
np.median np.nanmedian 求所有元素的中位数
np.percentile np.nanpercentile 计算基于元素排序的统计值
np.any N/A 验证是否有任何一个元素为真
np.all N/A 验证所有元素是否为真

3.数据选取

array[条件表达式]

(1)比较运算符

运算符 通用函数名称
== np.equal
!= np.notequal
< np.less
<= np.less_equal
> np.greater
>= np.greater_equal

(2)逻辑运算符

运算符 通用函数名称
& np.bitwise_and
| np.bitwise_or
~ np.bitwise_not
^ np.bitwise_xor

示例:


NumPy_第15张图片

(3)掩码

NumPy_第16张图片

可通过掩码数组选取数组元素(花哨索引)

array[掩码数组]

4.广播

广播(broadcasting)指的是不同形状的数组之间的算术运算的执行方式。
示例:


NumPy_第17张图片

5.矩阵运算

np.dot(数组1, 数组2, out = None)

若两数组均为向量,则返回两向量的点积。
若两数组均为矩阵,则返回矩阵内积。

6.轴变换

(1)矩阵转置

array.T只适用于矩阵转置

array.T

(2)高维数组轴变换

  • 1.array.transpose()方法
    array.transpose()方法支持重新设置轴次序
array.transpose(轴次序)
  • 2.arr.swapaxes()方法
    arr.swapaxes()方法只接受一对轴的轴变换
arr.swapaxes(轴1, 轴2)

四、数组的排序

1.np.sort()

  • 1.生成副本
    np.sort()方法会生成一个副本返回。
np.sort(数组, axis=排序轴)
NumPy_第18张图片
  • 2.就地排序
array.sort()
NumPy_第19张图片

2.np.argsort()

np.argsort()方法返回排序后的索引
示例:


NumPy_第20张图片

3.部分排序(分隔)

np.partition()方法排序后,最左边是数组中最小的k个值

np.partition(array, k)

示例:


五、NumPy结构化数组

1.定义结构化数组

'names':规定了数据的属性名
'formats':规定了对应属性的数据类型

data = np.zeros(元素个数, dtype={'names': ('变量名1', '变量名2', ......), 'formats': ('变量1数据类型', '变量2数据类型', ......)})
类型名 = np.dtype({'names': ('变量名1', '变量名2', ......), 'formats': ('变量1数据类型', '变量2数据类型', ......)})
np.zeros(元素个数, dtype=类型名)

数据类型

NumPy数据类型符号 描述 示例
'b' 字节型 np.dtype('b')
'i' 有符号整型 np.dtype('i4') == np.int32
'u' 无符号整型 np.dtype('u1') == np.uint8
'f' 浮点型 np.dtype('f8') == np.int64
'c' 复数浮点型 np.dtype('c16') == np.complex128
'S'或'a' 字符串 np.dtype('S5')
'U' Unicode编码字符串 np.dtype('U') == np.str_
'V' 原生数据,raw data(空,void) np.dtype('V') == np.void

2.填充值

data['键'] = 列表

示例:

data = np.zeros(4, dtype={'names': ('name', 'age', 'weight'), 'formats': ('U10', 'i4', 'f8')})
name = ['Alice', 'Bob', 'Cathy', 'Doug']
age = [25, 45, 37, 19]
weight = [55.0, 85.5, 68.0, 61.5]
data['name'] = name
data['age'] = age
data['weight'] = weight

3.查询

NumPy_第21张图片

你可能感兴趣的:(NumPy)