Numpy笔记

本文最后更新于:2024年8月11日 晚上

Numpy

numpy往往与SciPymatplotlib一起使用来替代一些matlab的功能

Ndarry

基本操作

  • 一个N维数组对象,只能存放==同类型==数据,跟C语言的数组类似
  • 默认是行向量,使用nd.Tnd转换成列(一维是不可转的)
    也可以使用reshape(-1,1)的方法强行要求只有一列,那看起来就是列向量了,实际上是二维向量
  • numpy.arry(object,dtype=none,copy=true,order=true,ndmin=0)
    • object:数组或嵌套的数列
    • dtype:数组的元素类型
    • copy:是否拷贝,如果不拷贝则对原数组进行修改,否则返回修改后的副本
    • order:创建数组的方向,C为行方向,F为列方向,A为任意方向
    • ndmin:指定生成数组的最小维度

初体验

1
2
3
4
5
6
7
8
9
10
11
12
13
from numpy import arry
// 生成一维的数组,跟列表是一样的
lst = [1,2,3,4]
lst_1 = arry(lst)
>>> [1,2,3,4]

// 生成二维数组,就是列表嵌套
lst_2 = arry([lst,lst])
>>>[[1,2,3,4],[1,2,3,4]]

// 指定生成二维数组
lst_1_2 = arry(lst,ndmin=2)
>>> [[1,2,3,4]]

指定数据类型

1
2
3
4
5
from numpy import arry
// 指定数据类型为复数(complex)
lst = [1,2,3]
lst_cp = arry(lst,dtype=complex)
>>>[1.+0.j,2.+0.j,3.+0.j]

支持的数据类型

名称 类型 描述
bool_ 标准布尔值(True|False)
int_ 默认整形 默认整形方法在未来版本会==被淘汰==
intN 长度为N的整形 N可取8,16,32,64
可以使用i1,i2,i4,i8指代
需要从Numpy包导入这些指代
uintN 无符号长度为N的整形 N可取8,16,32,64
float_ 双精度(64bit)
float16 半精度
float32 单精度
complex_ 双64bit浮点数表示复数
complex64 双32bit浮点数表示复数

内建数据类型字符

字符 类型
b 布尔值
i 有符号整形
u 无符号整形
f 浮点型
c 复数浮点
m 时间间隔(timedelta)
M 时间日期(datetime)
O 对象(Object)
S,a 字符串(字节)
U Unicode
V 原始数据(void)

数据类型对象(dtype)

  • 数据类型
  • 数据大小(字节)
  • 数据顺序(大端法|小端法)以(<表示小端法以>表示大端法)

构造数据类型

  • numpy.dtype(object,align,copy)
    • object:需要转换的数据类型对象
    • copy:复制dtype对象,布尔值

基本使用

1
2
3
4
5
from numpy import dtype
from numpy import i8
dt = dtype([('age',i8)])
print(dt)
>>>[('age','i1')]

构造一个结构化对象,类似于数据库的各个字段

1
2
3
4
5
from numpy import dtype,arry
// 构造字段Student(name,age,marks)
student = dtype([('name','S20'),('age','i1'),('marks','f4')])
// 创建一个表
table = arry([('dustella',20,99),('jinzhi0123',18,99)],dtype=student)

数组属性

  • 数组的维数称为秩数(rank)
  • 每个线性的数组称为一个轴(axis),轴的数量就是秩
  • 如果要对每一列进行操作,可以设置轴axis=0,对每一行进行操作,可以设置轴axis=1
属性 说明
ndim
shape 维数,nxm矩阵,返回一个tuple[行数,列数]
size n*m的值,元素数量
dtype 数据类型
itemsize 每个元素的大小,单位为字节
reshape 返回一个shape后的==副本==

.shape

1
2
3
4
5
6
# 将c转换成3行4列
c.shape = 3,4
# 要求np自动判断多少列,仅要求用3行
c.shape = 3,-1
# 升级成三维
c.shape = 3,3,-1

创建数组

  • 创建一个指定维数、格式化的空数组,此时数组元素是未初始化的随机值

    ==NOTE==

    shape中如果使用(a,b)等元组,则创建相应的维数

    使用单个数则是生成一维数组

    numpy.empty(shape,dtype,order)

  • 创建一个指定维数、格式化的数组,元素以0进行初始化

    numpy.zeros(shape,dtype,order)

  • 创建一个指定维数、格式化的数组,元素以1进行初始化

    numpy.ones(shape,dtype,order)

  • 创建一个对角矩阵(单位矩阵:对角线是1,其余为0)

    numpy.eye(shape)

  • 生成一个随机整数矩阵

    numpy.random.randint(start,end,side)

    size接受随机矩阵的维数

  • 由python对象生成数组

    numpy.arry(<python object>,dtype,order)

  • ==动态数组==

    numpy.frombuffer(buffer,dtype,count,offset)

    • buffer:任意对象,以流形式读入,使用字符串时先转换成二进制比特流
    • dtype:返回的数组类型
    • count:读取的数据数量,-1为读取所有数据
    • offset:起始的读取位置
  • 可迭代对象生成数组

    numpy.fromiter(iterable,dtype,count=-1)

  • ==数值范围生成==数组

    numpy.arange(start,stop,step,dtype)

    不含stop

    大多返回一维数组,python内置的range只能生成整数

  • 从==等差数列==生成数组

    numpy.linspace(start,stop,num=50,endpoint,restep=False,dtype)

    • start|stop:起始值|终止值(含)

    • num:等步长的样本数量

    • endpoint:数列中是否包含stop值,布尔值

      ==NOTE==

      linspace(0,1,10)将0~1分成10份,由于最终点是1,因此从0开始每次只增长1/9,需要每次增长0.1的,需要分成11份,这样每次就步长1/10了,或者将endpoint=False

  • ???

    numpy.logspace(start,stop,num,endpoint=True,base=10.0,dtype)

    • base:对数log的底数

取缔循环

python中的循环是缓慢的,通过数组操作可以取缔循环

1
2
3
4
5
# 不使用python的循环语句完成一个列表数值的平方操作
from numpy import np
y = list(range(11))
y_ = np.array(y)
y_**2

矩阵计算

加法

当一行加一列时会发生自动扩展(广播)

==按行|列求和==

1
2
3
4
# 有一个多维向量,要求按行求和
res = np.sum(ary,axis=1)
# 有一个多维向量,要求按列求和
res = np.sum(ary,axis=0)

此外还有var|max|avg等通用函数

数组访问

切片

  • 通过内置的方法切片slice(start,stop,step)
  • 直接切片<arry object>[start,stop,step]

索引(高级索引)

Numpy可以通过==整数数组==索引、==布尔数组==索引、==花式索引==

整数索引

对于一个2X2数组矩阵,可以通过类似于直角坐标系方式的整数数组方式索引

1
2
3
4
from numpy import xrange
ary = arry([[1,2,3],[5,6,7],[7,8,9]])
# 提取下标为1 1 0的三个数组
res = ary([1,1,0])

你也可以把一个一维数组当做索引数组传入,将其值索引出来

二维矩阵索引

对于一个二维矩阵multi

  • multi[0,3:5]:第0行的第三列到第五列(不含)
  • multi[4:,4:]:第四行、第四列开始的一个方阵
  • multi[:,2]:提取第二列的所有行
  • multi[2::2,::2]:第二行开始,步长为2(即双数)的行,从0开始到最后一列(步长为2)的列

Do Myself

矩阵转置:

1
2
3
4
row = np.array([[1],[2],[3],[4]])
# 使用reshape方法转置成4行,1列
col_1 = row.reshape((4,1))
# 使用转置方法 .T

拆分数组

1
2
# Array:需要拆分的数组  Num:拆分的份数  axis:沿 1:y轴 0:x轴拆分
np.split(Array,Num,axis)

沿着任意一个数组的列拆分:

1
np.split(array,array.shape[1],axis=1)

数组展平:

1
2
old = np.array([[1,2,3,4],[5,6,7,7]])
new = old.flatten()

Numpy笔记
https://qlozin.top/2023/03/09/Python numpy/
作者
QLozin
发布于
2023年3月10日
更新于
2024年8月11日
许可协议