目录
一、简介
1、概念
NumPy(Numerical Python)是一个用于科学计算的 Python 库,提供了多维数组对象(ndarray)以及数学函数,用于处理大规模数据集和执行数值计算。
2、优点
当数据量达到一定级别后,NumPy 计算会比原生 Python 快。
python
import time
start_time = time.time()
numbers = list(range(1, 1000001))
total = sum(numbers)
end_time = time.time()
print("原生 Python 计算100万个元素的和耗时:", end_time - start_time)
python
import time
import numpy as np
start_time = time.time()
numbers = np.arange(1, 1000001)
total = np.sum(numbers)
end_time = time.time()
print("NumPy 计算100万个元素的和耗时:", end_time - start_time)
3、特点
Numpy 的主要对象是同种元素的多维数组。这是⼀个所有的元素都是⼀种类型、通过⼀个正整数元组索引的元素表格(通常是元素是数字)。在 Numpy 中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。
NumPy 数组 是⼀个多维数组对象,称为 ndarray。由两部分组成:实际的数据和描述这些数据的元数据。
4、作用
可以构造⼀个比普通列表大的多的数组,并且可以很灵活的对其中所有的元素进行并行化操作。
5、引用
pip install numpy
import numpy as np # 导入 NumPy 库并使用别名 np
二、创建数组
1、创建一维数组
一维数组是最简单的数组形式,也被称为向量,它只有一个维度,即行(或列)。
一维数组类似于 Python 中的列表,但它可以包含相同类型的数据元素。
一维数组在数学和计算中常用于表示一系列数据点或向量。
创建方式
- 直接传入列表的方式
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1) # [1 2 3 4 5]
- 传入 range 生成序列
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr2 = np.array(range(1, 6))
print(arr2) # [1 2 3 4 5]
- 使用 numpy 自带的 np.arange() 生成数组
python
import numpy as np # 导入 NumPy 库并使用别名 np
# np.arange(起始索引,结束索引,步长)
arr3 = np.arange(1, 6, 2)
print(arr3) # [1 3 5]
- 使用 np.linspace() 生成等间隔的数组
python
import numpy as np # 导入 NumPy 库并使用别名 np
# np.linspace(起始索引,结束索引,步长)
arr4 = np.linspace(1, 5, num=5)
print(arr4) # [1. 2. 3. 4. 5.]
3、创建二维数组
- 二维数组是具有两个维度的数据结构,通常表示矩阵。
- 第一个维度表示行数,第二个维度表示列数。
- 二维数组在数学和计算中用于表示表格数据、图像、矩阵等多种数据结构。
python
import numpy as np # 导入 NumPy 库并使用别名 np
# 创建包含2行3列的二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
# [[1 2 3]
# [4 5 6]]
# 创建一个2x3的二维数组,其中每个元素都是0
arr = np.array([[0, 0, 0], [0, 0, 0]])
print(arr)
# [[0 0 0]
# [0 0 0]]
# 创建一个2x3的全0二维数组
arr = np.zeros((2, 3))
print(arr)
# [[0. 0. 0.]
# [0. 0. 0.]]
# 创建一个2x3的全1二维数组
arr = np.ones((2, 3))
print(arr)
# [[1. 1. 1.]
# [1. 1. 1.]]
# 创建一个2x2的单位矩阵
arr = np.eye(2)
print(arr)
# [[1. 0.]
# [0. 1.]]
三、属性和数组运算
1、基本属性
- 元素个数:size
- 元素类型:dtype
- 元素字节大小:itemsize
- 秩:ndim
- 维度:shape
- 元素缓冲区:data
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
print(arr) # [1 2 3 4 5]
size = arr.size
print(size) # 5
dtype = arr.dtype
print(dtype) # int32
itemsize = arr.itemsize
print(itemsize) # 4
dim = arr.ndim
print(dim) # 1
shape = arr.shape
print(shape) # (5,)
data = arr.data
print(data) # <memory at 0x0000029E7F205C00>
2、数据类型
NumPy 支持多种数据类型,如整数、浮点数、布尔值等。可以使用 dtype 参数指定数据类型。
类型 | 说明 |
---|---|
bool | 用一个字节存储的布尔类型(True 或 False) |
int | 由所在平台决定其大小的整数(一般为 int32 或 int64) |
int8 | 一个字节大小的整数,范围为 -128 到 127 |
int16 | 两个字节大小的整数,范围为 -32768 到 32767 |
int32 | 四个字节大小的整数,范围为 -2^31 到 2^32-1 |
int64 | 八个字节大小的整数,范围为 -2^63 到 2^63-1 |
uint8 | 一个字节大小的无符号整数,范围为 0 到 255 |
uint16 | 两个字节大小的无符号整数,范围为 0 到 65535 |
uint32 | 四个字节大小的无符号整数,范围为 0 到 2^32-1 |
uint64 | 八个字节大小的无符号整数,范围为 0 到 2^64-1 |
float16 | 半精度浮点数,16 位,正负号 1 位,指数 5 位,精度 10 位 |
float32 | 单精度浮点数,32 位,正负号 1 位,指数 8 位,精度 23 位 |
float64 或 float | 双精度浮点数,64 位,正负号 1 位,指数 11 位,精度 52 位 |
complex64 | 复数,分别用两个 32 位浮点数表示实部和虚部 |
complex128 或 complex | 复数,分别用两个 64 位浮点数表示实部和虚部 |
python
import numpy as np # 导入 NumPy 库并使用别名 np
# 创建指定数据类型的数组
arr = np.array([1, 2, 3], dtype=np.float32)
print(arr) # [1. 2. 3.]
3、数组运算
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
# [[1 2 3]
# [4 5 6]]
print(arr + arr)
# [[ 2 4 6]
# [ 8 10 12]]
print(arr - arr)
# [[0 0 0]
# [0 0 0]]
print(arr * arr)
# [[ 1 4 9]
# [16 25 36]]
print(arr / arr)
# [[1. 1. 1.]
# [1. 1. 1.]]
广播机制
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(1 / arr)
# [[1. 0.5 0.33333333]
# [0.25 0.2 0.16666667]]
四、索引和切片
1、基本索引
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
# 获取第三个元素
element = arr[2]
print(element) # 3
2、多维数组索引
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
# 获取第二行第三列的元素
element_2d = arr_2d[1, 2]
print(element_2d) # 6
3、基本切片
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
# 获取索引1到3的子数组
arr_slice = arr[1:4] # 左闭右开
print(arr_slice) # [2, 3, 4]
4、多维数组切片
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
# 获取所有行的第二列及之后的元素
arr_2d_slice = arr_2d[:, 1:] # 逗号前是行,逗号后是列,:表示所有
print(arr_2d_slice)
# [[2, 3],
# [5, 6]]
5、布尔索引
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
# 返回一个布尔数组,表示大于3的元素
bool_index = arr > 3
subset_by_bool = arr[bool_index]
print(subset_by_bool) # [4, 5]
6、花式索引
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
# 获取索引为第0,2,4的子数组
indices = np.array([0, 2, 4])
fancy_indexing = arr[indices]
print(fancy_indexing) # [1, 3, 5]
7、修改元素值
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
# 将索引1的元素修改为10
arr[1] = 10
print(arr) # [ 1 10 3 4 5]
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
# 将第一行第二列的元素修改为20
arr_2d[0, 1] = 20
print(arr_2d)
# [[ 1 20 3]
# [ 4 5 6]]
索引和切片的区别总结:
- 返回类型: 索引返回的是单个元素值,而切片返回的是数组的一个视图。
- 是否影响原数组: 对索引得到的元素的修改不会影响原数组,而对切片的修改会影响原数组。
- 用法: 索引用于获取特定位置的元素,而切片用于获取数组的子集。
五、统计函数
1、均值
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
mean_value = np.mean(arr)
print(mean_value) # 3.0
2、中位数
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
median_value = np.median(arr)
print(median_value) # 3.0
3、总和
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
sum_value = np.sum(arr)
print(sum_value) # 15
4、乘积
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
product_value = np.prod(arr)
print(product_value) # 120
5、最小值
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
min_value = np.min(arr)
print(min_value) # 1
6、最大值
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
max_value = np.max(arr)
print(max_value) # 5
7、标准差
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
std_deviation = np.std(arr)
print(std_deviation) # 1.4142135623730951
8、方差
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
variance = np.var(arr)
print(variance) # 2.0
9、协方差
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([5, 4, 3, 2, 1])
covariance_matrix = np.cov(arr1, arr2)
print(covariance_matrix)
# [[ 2.5 -2.5]
# [-2.5 2.5]]
10、百分位数
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
percentile_50 = np.percentile(arr, 50)
print(percentile_50) # 3.0
11、直方图
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
histogram_values, bin_edges = np.histogram(arr, bins=5)
print(histogram_values, bin_edges) # [1 1 1 1 1] [1. 1.8 2.6 3.4 4.2 5. ]
12、相关系数
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([5, 4, 3, 2, 1])
correlation_matrix = np.corrcoef(arr1, arr2)
print(correlation_matrix)
# [[ 1. -1.]
# [-1. 1.]]
六、按条件筛选
1、基本用法
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
indices = np.where(arr > 2)
print(indices) # (array([2, 3, 4], dtype=int64),)
2、返回满足条件的元素
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
values = arr[np.where(arr > 2)]
print(values) # [3 4 5]
3、替换满足条件的元素
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
arr[np.where(arr > 2)] = 0 # 大于2的返回0
print(arr) # [1 2 0 0 0]
4、使用三元表达式
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
new_arr = np.where(arr > 2, 0, arr) # 大于2的返回0
print(new_arr) # [1 2 0 0 0]
5、多条件选择
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([1, 2, 3, 4, 5])
indices = np.where((arr > 2) & (arr < 5))
print(indices) # (array([2, 3], dtype=int64),)
6、返回满足条件的元素的坐标
python
import numpy as np # 导入 NumPy 库并使用别名 np
arr = np.array([[1, 2, 3], [4, 5, 6]])
coordinates = np.where(arr > 2)
print(coordinates) # (array([0, 1, 1, 1], dtype=int64), array([2, 0, 1, 2], dtype=int64))
arr = np.array([[1, 2, 3], [4, 5, 6]])
coordinates = arr[np.where(arr > 2)]
print(coordinates) # [3 4 5 6]
记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~