1.Numpy介绍
NumPy(Numerical Python)是Python的一种开源的数值计算扩展。提供多维数组对象,各种派生对象(如掩码数组和矩阵),这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。
-
几乎所有从事Python工作的数据分析师都利用NumPy的强大功能。
- 强大的N维数组
- 成熟的广播功能
- 用于整合C/C++和Fortran代码的工具包
- NumPy提供了全面的数学功能、随机数生成器和线性代数功能
派生对象“掩码数组”
在NumPy中,掩码数组(Masked Array)是一种特殊的数组对象,用于处理包含无效或缺失数据的多维数组。它是NumPy提供的numpy.ma模块中的核心功能,主要用于在数值计算中屏蔽(或忽略)某些特定元素,同时保留数组的结构和运算能力。
掩码数组可以通过以下方式创建:
- 手动指定掩码:
1 2 3 4 5 import numpy as np data = np.array([1, 2, 3, 4, 5]) mask = [False, False, True, False, True] # True表示该元素被屏蔽 masked_array = np.ma.MaskedArray(data, mask=mask) print(masked_array) # 输出: [1 2 -- 4 --]在输出中,–表示被屏蔽的无效元素。
- 基于条件自动生成掩码:
1 2 3 data = np.array([1, -999, 3, -999, 5]) masked_array = np.ma.masked_equal(data, -999) # 屏蔽值为-999的元素 print(masked_array) # 输出: [1 -- 3 -- 5]- 处理无效值(如NaN):
1 2 3 data = np.array([1.0, np.nan, 3.0, 4.0]) masked_array = np.ma.masked_invalid(data) # 屏蔽NaN值 print(masked_array) # 输出: [1.0 -- 3.0 4.0]
2.数组创建
创建数组的最简单的方法就是使用array函数,将Python下的list转换为ndarray。
1
2
3
4
5
6
import numpy as np
l = [1, 3, 5, 7, 9]
arr1 = np.array(l)
print(type(arr1)) # <class 'numpy.ndarray'>
print(arr1) # [1 3 5 7 9]
我们可以利用np中的一些内置函数来创建数组,比如我们创建全0的数组,也可以创建全1数组,全是其他数字的数组,或者等差数列数组,正态分布数组,随机数。
详细请参考笔记:numpy(2)_numpy基础,共有11种方法创建数组。下面是简单的记录
【1】np.zeros
1
2
3
4
5
6
7
"""
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
"""
arr_0 = np.zeros((3, 4), dtype=int)
print(arr_0)
【2】np.ones
1
2
3
4
5
6
7
"""
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
"""
arr_1 = np.ones((3, 5), dtype=float)
print(arr_1)
【3】np.full
1
2
3
4
5
6
"""
[[99 99 99]
[99 99 99]]
"""
arr_full_99 = np.full((2, 3), 99)
print(arr_full_99)
【4】np.eye
1
2
3
4
5
6
7
8
"""
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
"""
arr_eye = np.eye(4)
print(arr_eye)
【5】np.arange
1
2
3
4
5
"""
[ 0 2 4 6 8 10]
"""
arr_arange = np.arange(0, 11, 2)
print(arr_arange)
【6】np.linspace
1
2
3
4
5
"""
[ 0. 5.5 11. ]
"""
arr_linspace = np.linspace(0, 11, 3)
print(arr_linspace)
【7】np.random
5个
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
"""
[[9 6 2 0]
[9 2 2 9]]
"""
arr_ran_int = np.random.randint(0, 11, (2, 4))
print(arr_ran_int)
"""
[[[0.82461948 0.80205683 0.91808818]
[0.59448745 0.32702669 0.45675605]]]
"""
arr_ran_rand = np.random.rand(1, 2, 3)
print(arr_ran_rand)
"""
[[[0.38350666 0.8359796 0.536559 ]
[0.42221114 0.07320376 0.00182072]]]
"""
arr_ran_rand = np.random.random((1, 2, 3))
print(arr_ran_rand)
"""
[[ 0.18673611 0.03679561 -1.83121439 0.64007107]
[ 1.19512584 -0.44654913 0.04439526 0.40582882]
[ 0.27861324 0.21097366 -1.40959047 -1.77558357]]]
"""
arr_normal1 = np.random.randn(2, 3, 4)
print(arr_normal1)
"""
[[2.05182453 2.94018662 2.24328282]
[3.5150485 1.96491517 1.6601453 ]]
"""
arr_normal2 = np.random.normal(2, 1, (2, 3))
print(arr_normal2)
3.数组的查看操作
NumPy的数组类称为ndarray,也被称为别名 array。请注意,numpy.array
这与标准Python库类不同array.array
,后者仅处理一维数组且功能较少。ndarray对象的重要属性是
(1)纬度ndim
1
2
arr = np.ones((3, 4))
print(arr.ndim) # 2
(2)形状shape
1
2
arr = np.ones((8, 9))
print(arr.shape) # (8, 9)
(3)元素个数size
1
2
arr3 = np.full((3, 5), 1, dtype=int)
print(arr3.size) # 15
(4)大小itemsize(单位:字节)
itemsize指的是每一个元素的大小是多少字节,比如:
- np.int8:1 字节(8 位)
- np.int16:2 字节(16 位)
- np.int32:4 字节(32 位)
- np.int64:8 字节(64 位)
1
2
arr2 = np.eye(4, dtype=int)
print(arr2.itemsize) # 8
(5)数据类型dtype
1
2
3
4
5
"""
float64
"""
arr1 = np.zeros((3, 5), dtype=float)
print(arr1.dtype)
4.文件I/O操作
(1)保存与读取数组
save方法保存ndarray到一个npy文件,也可以使用savez将多个array保存到一个.npz
文件中, 保存时以key-value形式保存,key任意
保存的
.npy
文件是二进制格式,存储效率高,适合保存单个数组。.npy
文件保留了数组的形状、数据类型和数据内容,加载时可以精确恢复。
.npz
文件本质上是一个 ZIP 存档,包含多个.npy
文件。
.npz
文件是压缩格式,适合保存多个数组,节省存储空间。每个数组存储为独立的.npy
文件,并打包在.npz
存档中。加载
.npz
文件时,返回一个NpzFile
对象,包含所有保存的数组,可以通过名称或索引访问。
注意:下面的扩展名可以省略不写,比如np.save("a1.npy", arr1)
可以写为np.save("a1", arr1)
1
2
3
4
5
6
7
8
9
10
11
import numpy as np
arr1 = np.ones((3, 4), dtype=int)
np.save("a1.npy", arr1)
load_a1 = np.load("a1.npy")
print(load_a1)
arr2 = np.zeros((2, 3), dtype=float)
np.savez("multiArr.npz", arr_x=arr1, arr_y=arr2)
load_multi = np.load("multiArr.npz")
print(load_multi["arr_x"])
print(load_multi["arr_y"])
(2)读写csv、txt文件
1
2
3
4
arr_txt = np.ones((3, 4),dtype=int)
np.savetxt("arr_txt.txt", arr_txt, delimiter=",")
arr_txt_read = np.loadtxt("arr_txt.txt", delimiter=",", dtype=float)
print(arr_txt_read)
csv同理。