【数据分析】之【Numpy】学习知识梳理
一、dtype的用法
1. dtype 是用于描述数据类型的对象
2. 常见dtype类型

3. 用途
3.1 创建数据时可以指定dtype
3.2 可用于数据类型转换-->np.astype()
ini
import numpy as np
a=np.arange(1,10)
b=a.astype('float32')
print(b)
3.3 dtype自定义数据类型
php
import numpy as np
date=[('zhangsan',(90,100,99),18),
('lisi',(98,90,99),19),
('wangmazi',(97,102,77),17)]
# 1. dtype自定义数据类型
a=np.array(date,dtype={#用字典键值对的形式
'names':['name','scores','age'],
'formats':['U8','3int','int']
})
print(a)
# 2. 测试数组中存储日期数据类型
date2=['2006-03-21','2002-03-17','2025','2025-06-08T21:37:50']
b=np.array(date2)
print(b)
print('-'*50)
#用astype转换数据类型
b=b.astype('M8[s]')
print(b)
#两点注意:
#1. 日期中比如三月不能用3表示,要用03表示
#2. M8[*]中限制输出时,年月日为大写Y,M,D;时分秒为小写h,m,s
print('-'*50)
二、数组变维
1. 什么时候用数组变维?
·数据处理:例如将一维数据转换为二维矩阵,便于进行矩阵运算。 ·模型输入要求:机器学习模型通常要求输入特定形状的数组(如(batch_size, height, width, channels))。 ·内存效率:高维数组可以在不复制数据的情况下重新组织视图。
2. NumPy 数组变维的主要方法
2.1. reshape() 方法
功能:返回一个新的数组对象,具有指定的维度,原数组数据不变。 语法:array.reshape(shape) 或 np.reshape(array, shape)
2.2. 直接赋值修改 shape 属性(就地变维)
功能:直接改变原数组的形状(注意:数据布局不变,可能导致逻辑错误)。 语法:array.shape = new_shape。
2.3. ravel() 和 flatten():多维数组展平为一维
ravel():返回视图(不复制数据),修改会影响原数组。 flatten():返回副本(复制数据),修改不影响原数组。
2.4 上述方法示例代码
scss
import numpy as np
#共享变维---改变d,c也会改变;改变c,d也会改变
c=np.arange(1,10)
print(c)
d=c.reshape(3,3)
print('共享变维',d)
print('-'*50)
#复制变维---数据之间相互独立---flatten
e=c.flatten()
print('复制变维',e)
print('-'*50)
#就地变维
#就地变维法一
e.shape=(3,3)
print('就地变维',e)
print('-'*50)
#就地变维法二
e.resize(9,)
print('就地变维方法二',e)
三、数组切片
1. 基本语法--和列表相似
arduino
array[start:stop:step, start:stop:step, ...] # 多维切片
start
:起始索引(包含,默认 0)。stop
:结束索引(不包含,默认数组长度)。step
:步长(默认 1,负数表示反向)。
2. 代码示例
python
import numpy as np
#数组切片
#数组对象[初始下标(包含):终止下标(不包含):步长]
#1. 初始下表省略默认为0,终止下标不写默认到数组结束,步长不写默认为1
#2. 初始、终止下标、步长为负数时,表示从后往前切
#3. 注意啊!!中间用:分隔
e=np.arange(1,10)
print('一维数组切片',e[0:6:1])
#多维数组切片
#eg:二维数组:数组对象[初始下标(包含):终止下标(不包含):步长 , 初始下标(包含):终止下标(不包含):步长]
# ->前半部分用来切行 ->后半部分用来切列
#三维数组也一样 [***,***,***,] ---> 第一部分用来切页,第二部分切行,第三部分切列
# 其中***就是这个结构:--> 初始下标(包含):终止下标(不包含):步长
注 :NumPy 切片返回原数组的视图,修改切片会影响原数组
四、数组的组合与拆分
1. 速查表

2.上述方法示例代码
ini
import numpy as np
# h 表示水平;v 表示垂直,d 表示深度;stack 表示组合;split 表示拆分
a=np.arange(1,7).reshape(2,3)
b=np.arange(7,13).reshape(2,3)
print(a,'-->a')
print(b,'-->b')
#水平方向的操作
c=np.hstack((a,b)) #要注意!!hstack()函数中的参数是元组,要再带上括号
print(c,'-->c')
a,b=np.hsplit(c,2) #注意!!拆成几份就要用几个对应的参数来接收
print(a,'-->a')
print(b,'-->b')
#垂直方向的操作类似,将"h"换成"v"即可
#深度方向的操作
d=np.dstack((a,b))
print(d,'-->d') #深度方向组合后得到的可能是从某一个角度看过去的多维数组的shape样子
e,f=np.dsplit(d,2)
print(e,'-->e')
print(f,'-->f')
# 代替上述所有的一个函数
# 通过axis作为关键字参数指定组合的方向 , 取值如下
# 0 : 垂直方向组合拆分
# 1 : 水平
# 2 : 深度 (深度只有三维数组能用)
# concatenate表示组合
# spilt表示拆分
h=np.concatenate((a,b),axis=1)
print(h,'-->h')
i,j=np.split(h,2,axis=1)
print(i,'-->i')
print(j,'-->j')
#长度不等的数组组合
a=np.array([1,2,3,4,5])
b=np.array([1,2,3,4])
# 填充b数组使其长度与a相同,头部补充0个元素,尾部补充1个元素
b=np.pad(b,pad_width=(0,1),mode='constant',constant_values=0)
# mode='constant'这一句一般是固定的,意思为补充的是常量,constant_values=0表示要补充进去的值
print(b,'-->b')
c=np.vstack((a,b))
print(c,'-->c')
#简单的一维数组组合方案
a=np.arange(1,9)
b=np.arange(9,17)
#将两个数组摞在一起形成两行
c=np.row_stack((a,b)) # 注意!!里面的参数是元组
print(c,'-->c')
#将两个数组并在一起形成两列
c=np.column_stack((a,b)) #注意!没有column_split、row_split
print(c,'-->c')
五、掩码基础
1.掩码
用于根据条件筛选或操作数组元素。掩码本质上是一个布尔数组(True
/False
),用于标记需要处理的元素位置。
2.基础示例(后续学习之后再补充)
ini
import numpy as np
#基于bool数组的掩码
a=np.arange(1,10)
mask=[True,False,True,False,True,False,True,False,True]
print(a[mask])
#eg: 输出100以内三的倍数
b=np.arange(1,100)
mask2=b%3==0
print(b[mask2])
#基于索引的掩码
names=np.array(['apple','vivo','oppo','xiaomi','huawei'])
mask3=[1,0,2,4,3]
print(names[mask3])
六、numpy的其他属性
见代码--后续持续补充
python
# shape -- 维度
# dtype -- 元素类型
# size -- 元素数量
# ndim -- 维数
# itemsize -- 元素字节数
# nbytes -- 总字节数
# real -- 复数数组的实部数组
# imag -- 复数数组的虚部数组
# T -- 数组对象的转置
# flat -- 扁平迭代器(将高维数组抻平成一维数组)
import numpy as np
a=np.arange(1,10).reshape(3,3)
print(a,'-->a')
print([x for x in a.flat])
第一次写笔记,欢迎大家批评指正!!