出现python专门设

出现python专门设

它是python专门设计的一个工具库,适合高性能的数据处理应用场景。

如下例子:可以清楚对比出numpy数组和list数组计算同一个操作展现出的性能差异

import time # 创建一个0-999999 python列表 py_list = list(range(1000000)) # 创建一个0-999999的numpy数组 np_arr = np.arange(1000000) start = time.time() # 记录当前时间 # Python 方式:用列表推导式对每个元素求平方,再用 sum() 求和 sum([x ** 2 for x in py_list]) print(f"Python列表耗时:{time.time() - start:.4f}s") # 耗时0.2591s start = time.time() # NumPy 方式:直接对整个数组做平方(向量化运算),再用 np.sum() 求和 np.sum(np_arr ** 2) # 采用f"..."格式化字符串,{}里的内容会计算后进行嵌入到字符串里 # :是分隔符,左边是格式化的值,右边是格式化的格式,也就是保留4位小数 print(f"NumPy数组耗时:{time.time() - start:.4f}s") # 耗时0.0109s

2.ndarray介绍 -- numpy核心

2.1 ndarray的核心特性

  1. 多维性:支持0维度,1维度(向量,一维数组),2维度(矩阵),以及更高维度的数组
  2. 同质性:所有元素类型必须一致(即使你定义时不一致,最后也会类型上升统一到一致,这样是为了快速计算),可以通过dtype制定
  3. 高效性:基于连续的内存块进行存储,支持向量化计算

2.1.1 多维性

支持0维度,1维度(向量,一维数组),2维度(矩阵),以及更高维度的数组

import numpy as np # 创建一个0维度的ndarry arr1 = np.array(1) print(arr1.ndim)
# 创建一个1维度的ndarrry arr2 = np.array([1,2,3,4]) print(arr2.ndim)
# 创建一个2维度的ndarray arr3 = np.array([[1,2,3],[2,3,4]]) print(arr3.ndim)

2.1.2 同质性

所有元素类型必须一致(即使你定义时不一致,最后也会类型上升统一到一致,这样是为了快速计算),可以通过dtype制定

# 制定类型进行创建 arr1 = np.array([1,2,3],dtype=np.int64) print(arr1.dtype) arr1 = np.array([1,2,3],dtype=np.int32) print(arr1.dtype) arr1 = np.array([1,2,3],dtype=np.float64) print(arr1.dtype)
# 即使数据类型不一致,也会进行类型的转换 arr2 = np.array([1,2,'nihao']) print(arr2.dtype) # 整体转为U11类型,就是11个固定长度的字符,必须要保证每一个元素的字节一样,才能高速计算 print(arr2)
arr3 = np.array([1,2,3.2]) print(arr3.dtype) # 整体转为float64类型 print(arr3)

2.1.3 高效性

基于连续的内存块进行存储,可以随机读写数据,支持向量化计算与广播特性

2.2 ndarray属性

shape: 数组的形状:行数和列数(或更高维度的尺寸)。

ndim: 维度数量:数组是几维的(1维、2维、3维等)。

size: 总元素个数:数组中所有元素的总数。

dtype: 元素类型:数组中元素的类型(整数、浮点数等)。

T: 转置:行变列,列变行。

===== 不太常用:=====

itemsize: 单个元素占用的内存字节数。

nbytes: 数组总内存占用量:size * itemsize。

flags: 内存存储方式:是否连续存储(高级优化)。

arr1 = np.array([[1,2,3],[2,3,4]]) print("形状:",arr1.shape) print("维度:",arr1.ndim) print("size = ",arr1.size) print("类型",arr1.dtype) print("转置",arr1.T) print("原数组",arr1)

3 ndarray的创建

主要有如下几类:具体的应用场景如下:

1.基础构造: 适用于手动构建小规模数组或复制已有数据。

2.预定义形状填充: 用于快速初始化固定形状的数组(如全0占位、全1初始化)。

3.基于数值范围生成: 生成数值序列,常用于模拟时间序列、坐标网格等。

4.特殊矩阵生成: 数学运算专用(如线性代数中的单位矩阵)。

5.随机数组生成: 模拟实验数据、初始化神经网络权重等场景。

6.高级构造方法: 处理非结构化数据(如文件、字符串)或通过函数生成复杂数组。

3.1 基础构造

3.1.1 np.array()

np.array():将列表/元组转换为 ndarray

例:np.array([[1, 2], [3, 4]])

import numpy as np arr1 = np.array([1,2,3,4]) print(arr1)
[1 2 3 4]
list = [1,2,3,4,5] arr2 = np.array(list) print(list)

3.1.2 np.copy()

np.copy(): 创建独立副本(深拷贝),与原数组相同但不共享内存,就是又new了一个

np.copy(arr)

import numpy as np arr1 = np.array([1,2,3,4]) arr2 = np.copy(arr1) print(arr1) print(arr2) arr2[2] = 5 # 进行修改又新生成的ndarray print(arr1) print(arr2)

3.2 预定义形状填充

3.2.1 np.zeros()

作用:根据传入的形状生成全0数组,快速初始化全0数组

调用:np.zeros(传入形状) 例:np.zeros((2,3))

zeros_arr = np.zeros((2,3)) print(zeros_arr) zeros_arr = np.zeros((2,3),dtype=np.int64) # 指定类型 print(zeros_arr)
[[0. 0. 0.] [0. 0. 0.]] [[0 0 0] [0 0 0]]

3.2.2 np.ones()

作用:根据传入的形状生成全1数组,快速初始化全1数组

调用:np.ones(传入形状) 例:np.ones((2,3))

ones_arr = np.ones((2,3)) print(ones_arr) ones_arr = np.ones((2,3),dtype=np.int64) print(ones_arr)
[[1. 1. 1.] [1. 1. 1.]] [[1 1 1] [1 1 1]]

3.2.3 np.empty()

作用:生成一个未初始化的数组,主要进行预分配内存,里面的值不是随机值,而是未初始化的内存 — 直接拿分配到的内存块里原来的内容来用,不做任何初始化。

调用:np.empty(传入形状) 例:np.empty((2,3))

empty_arr = np.empty((2,3,5)) print(empty_arr)
[[[1.25398642e-311 1.02765654e-321 0.00000000e+000 0.00000000e+000 1.16095442e-028] [5.02034658e+175 1.65713486e-076 9.94952968e-043 1.93334423e+184 1.60496009e-051] [1.50032769e-076 5.83278374e-144 3.59751658e+252 3.96046095e+246 1.04918621e-153]] [[7.69165785e+218 5.04621343e+180 1.04917822e-153 9.08366793e+223 1.65713486e-076] [9.94952968e-043 1.93334423e+184 1.60496009e-051 1.04917697e-153 1.94918966e-153] [1.10684845e-047 2.26301105e-076 2.10937826e-052 2.59027896e-144 7.79952704e-143]]]

3.2.4 np.full()

作用:生成一个指定形状,指定值的ndarray数组,里面的值是指定的。

调用:np.full(传入形状,填充值) 例:np.full((2,3),2)

full_arr = np.full((2,3),1) print(full_arr)
[[1 1 1] [1 1 1]]

3.3 基于数值范围生成

3.3.1 np.arange()

作用:生成一个等差序列,生成步长固定的序列(左闭右开),多使用生成[1,2,3,4,5]类似的数列

使用:np.arange(左起点,右终点,步长) 例:np.arange(0, 10, 2)

arange_arr = np.arange(0,11,1) print(arange_arr)
[ 0 1 2 3 4 5 6 7 8 9 10]

3.3.2 np.linspace()

作用:生成一个等间隔序列,生成制定数量的等间隔值(左闭右闭)

使用:np.linspace(左起点,右终点,数量) 例:np.linspace(0, 10, 3) -> [ 0. 5. 10.] 间隔值:(10-0) / (3-1) = 5

linespace_arr = np.linspace(0,10,5) print(linespace_arr)
[ 0. 2.5 5. 7.5 10. ]

3.3.3 np.logspace()

作用:生成一个生成对数间隔值,生成制定数量的等间隔值(左闭右闭)

使用:np.linspace(左起点,右终点,数量,底数) 例:np.logspace(0, 2, 3, base=10) -> [ 1. 10. 100.] 间隔值:(2-0) / (3-1) = 1 -> 0,1,2 -> 100,101,10^2

print(np.logspace(0, 2, 3, base=10))
[ 1. 10. 100.]

3.4 特殊矩阵生成

3.4.1 np.eye()

作用:生成一个单位矩阵

使用:np.eye(维度) 例:np.eye(2)

注意:np.eye(行,列) 也可以,这样虽然不是单位矩阵,但是包含一个最大的单位矩阵

print(np.eye(2))
[[1. 0.] [0. 1.]]
print(np.eye(2,3))
[[1. 0. 0.] [0. 1. 0.]]
print(np.eye(3,2))
[[1. 0.] [0. 1.] [0. 0.]]