numpy初级1-基本操作

NumPy 是 Python 的数值计算扩展,提供高效多维数组和掩码数组,支持矩阵运算、随机数生成和数学函数。掩码数组处理缺失数据,np.save 保存单一数组为 .npy 文件,np.savez 保存多数组为压缩 .npz 文件,适合高效存储和加载。

Posted by Hilda on July 14, 2025

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.random5个

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同理。