通过Python有效导入、存储和操作内存数据的技巧
数据来源:文档、图像、声音、数值等等,将所有的数据简单的看做数字数组 非常有助于 理解和处理数据
不管数据是何种形式,第一步都是 将这些数据转换成 数值形式 的可分析数据。
Numpy Numerical Python 的简称,
- Numpy 数组和python内置的列表类型 非常相似,随着数组在维度上的变大,Numpy数组更高效
- 导入numpy
import numpy as np
- 理解Python中的数据类型
python易用之处在于动态输入,不需要声明变量类型,是动态推断的。可以将任何类型的数据指定给任何变量
事实就是:Python变量不仅是他们的值,还包括了值得类型 的一些额外信息,
1)python的整型不仅仅是一个整型
标准的Python都是C语言编写的,每一个对象都是一个聪明的伪C语言结构体。该结构体包含其 值还有其他信息,
比如 x = 10000, x是一个指针,指向一个C语言的复合结构体。
查看 c语言 python安装目录\include\longintrepr.h
struct _longobject { PyObject_VAR_HEAD digit ob_digit[1]; };
扩展之后
struct _longobject { long ob_refcnt; PyTypeObject *ob_type; size_t ob_size; long ob_digit[1]; }
- ob_refcnt: 是一个引用计数,帮助python内存分配 回收
- ob_type: 变量的类型编码
- ob_size: 数据成员的大小
- ob_digit: python变量表示的实际整型值
因为python的动态类型特性,可以创建一个异构的列表
L = [ True, "2", 3.0, 4] [type(item) for item in L]
输出:[bool, str, float, int]
灵活具有代价,列表中的每一项必须包含各自的类型信息,引用计数和其他信息。每一项都是一个完整的Python对象。
如果所有变量是同一类型,就有 冗余信息。
Python中固定类型数组
import array A = array.array('i', [0,1,2]) A
输出:array('i', [0, 1, 2])
Numpy从Python列表创建数组
np.array([1,2,3,4,5])
输出:array([1, 2, 3, 4, 5])
必须是同一类型的数据。如果类型不匹配会自动向上转换,
明确设置数据类型,加参数dtype
np.array([1,2,3,4],dtype='float32')
输出:array([1., 2., 3., 4.], dtype=float32)
设置多为数组
np.array([list(range(i, i+3)) for i in [2,4,6]])
输出:array([[2, 3, 4],
[4, 5, 6],
[6, 7, 8]])
Numpy从头创建数组
# 创建一个长度为10的数组,数组的只都是0 np.zeros(10, dtype=int) # 创建一个3*5 的浮点型数组,数组的值都是1 np.ones((3, 5), dtype=float) # 创建一个3*5 的浮点型数组,数组的值都是4.14 np.full((3,5), 4.14) # 创建一个线性序列, 从0 开始,到20 ,步长为2 np.arange(0, 20, 2) # 创建一个5个元素的数组,五个数均匀的分配到0-1 np.linspace(0,1,5) np.linspace(0,2,5) # 创建一个3*3的、在0-1均匀分布的随机数组组成的数组 np.random.random((3, 3)) # 创建一个3*3 均值为0,标准差为1 的正态分布的随机数 数组 np.random.normal(0,1,(3,3)) # 创建一个 3*3, [0,10) 区间的随机整型数组 np.random.randint(0, 10, (3, 3)) # 创建一个3 *3 的单位矩阵 np.eye(3) # 创建三个整型数 组成的 未初始化的数组,初始值是内存空间任意值 np.empty(3)
Numpy标准数据类型
Data type | Description |
---|---|
bool_ | Boolean (True or False) stored as a byte |
int_ | Default integer type (same as C long; normally either int64 or int32) |
intc | Identical to C int (normally int32 or int64) |
intp | Integer used for indexing (same as C ssize_t; normally either int32 or int64) |
int8 | Byte (-128 to 127) |
int16 | Integer (-32768 to 32767) |
int32 | Integer (-2147483648 to 2147483647) |
int64 | Integer (-9223372036854775808 to 9223372036854775807) |
uint8 | Unsigned integer (0 to 255) |
uint16 | Unsigned integer (0 to 65535) |
uint32 | Unsigned integer (0 to 4294967295) |
uint64 | Unsigned integer (0 to 18446744073709551615) |
float_ | Shorthand for float64. |
float16 | Half precision float: sign bit, 5 bits exponent, 10 bits mantissa |
float32 | Single precision float: sign bit, 8 bits exponent, 23 bits mantissa |
float64 | Double precision float: sign bit, 11 bits exponent, 52 bits mantissa |
complex_ | Shorthand for complex128. |
complex64 | Complex number, represented by two 32-bit floats |
complex128 | Complex number, represented by two 64-bit floats |
Numpy数组基础
Python中的数据操作几乎等同于Numpy数组操作,学习获取数据 子数组, 对数组进行分裂,变形, 连接
- 数组的属性
确定数组的大小、形状、存储大小、数据类型 - 数组的索引
获取和实则数组各个元素的值 - 数组的变形
改变给定数组的形状 - 数组的拼接和分裂
将多个数组合并为一个,将一个数组分裂成多个
Numpy数组的属性
- 每个数组有 ndim(数组的维度)、 shape(每个维度的大小)、size(数组的总大小)、dtype(数据类型)、itemsize(每个元素的字节大小) 、 nbytes(数组总字节大小)
np.random.seed(0) # 设置随机数种子 x1 = np.random.randint(10, size=6) # 一维数组 array([5, 0, 3, 3, 7, 9]) x2 = np.random.randint(10, size=(3, 4)) # 二维数组 array([[3, 5, 2, 4], [7, 6, 8, 8],[1, 6, 7, 7]]) x3 = np.random.randint(10, size=(3,4,5)) # 三维数组 print(f"x1 nidim: {x1.ndim} , shape: {x1.shape}, size: {x1.size} ") print(f"x2 nidim: {x2.ndim} , shape: {x2.shape}, size: {x2.size} ") print(f"x3 nidim: {x3.ndim} , shape: {x3.shape}, size: {x3.size} ") print(f"x1 dtype: {x1.dtype}") print(f"x1 itemsize: {x1.itemsize}") print(f"x1 nbytes: {x1.nbytes}") # 输出如下 x1 nidim: 1 , shape: (6,), size: 6 x2 nidim: 2 , shape: (3, 4), size: 12 x3 nidim: 3 , shape: (3, 4, 5), size: 60 x1 dtype: int32 x1 itemsize: 4 x1 nbytes: 24
数组索引:获取单个元素
索引:从0开始计数
print(x1) # 第0个元素 x1[0] # 最后一个元素 x1[-1] # 多维数组,用逗号分割 print(x2) x2[0,0] print(x2[1, 1])
数组切片:获取子数组
就是python里的切片 slice 符号 :
x[start:stop:step]
- 一维子数组
# 一维子数组 x = np.arange(10) print(x) x[:5] # 前五个元素 x[5:] # 索引5开始及以后的元素 x[4:7] # 索引4 5 6 的元素, 左闭右开 x[::2] # 每隔一个元素 # 步长值为负数,就是start 和 stop交换。 x[::-1] # 逆序 x[9:5:-1] # 输出 [0 1 2 3 4 5 6 7 8 9] array([0, 1, 2, 3, 4]) array([9, 8, 7, 6]) # x[9:5:-1] 的额输出
- 多维子数组,
也是通过逗号 分割。
获取数组的行 和 列
注意:数组切片返回的是数组数据的视图,修改子数组,原来的数组也会被修改。
如果要复制,使用copy()方法实现
数组的变形
reshape()函数
将1-9 放入一个3*3的矩阵
原始数组的大小必须和变形后的数组大小一致
将一个一维数组转变为二维的行或列的矩阵
使用newaxis
获得列向量
数组拼接和分裂
将多个数组合并为一个,或将一个数组分裂成多个
- 数组的拼接
np.concatenate np.vstack np.hstack
二维数组的拼接
第二个轴
沿着固定维度处理数组时,使用np.vastack(垂直栈)和 np.hstack(水平栈)函数更简洁
ps:必须一致。
np.dstack 沿着第三个维度拼接数组
- 数组的分裂
np.split np.hsplit np.vsplit
传递参数可以是索引列表,索引列表记录的是分裂点位置
使用axis参数
N个分裂点会得到N+1个子数组
np.vsplit 垂直分割
np.hsplit 水平分割
同样,np.dsplit 第三个维度分裂。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统