提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
上一节学习了matplotlib,这节学习另一个库——numpy。numpy 负责数据的高效计算与存储,matplotlib 负责将 numpy 处理的数据可视化呈现。搭配 matplotlib 使用,能直接可视化 numpy 数组的结果。
一、numpy是什么?
NumPy(Numerical Python 的简称)是 Python 编程语言的一个核心科学计算库,它提供了高性能的多维数组对象(ndarray)以及用于数组操作的数学函数集合。简单来说,NumPy 是 Python 进行数值计算和数据分析的基础。
二、环境准备与数组基础
1.引入numpy库
代码如下:
import numpy as np
2 创建数组
代码如下:
t1=np.array([1,2,4,6,3])
t2=np.arange(10) #相当于np.array(range(10))
print(t1)
print(t2)
输出如下:
[1 2 4 6 3]
[0 1 2 3 4 5 6 7 8 9]
arrange的用法arange([start,] stop[, step,], dtype=None)
数组中数据类型查看
代码如下:
print(t1.dtype)
输出如下:
int64
| 数据类型及描述 | |
|---|---|
| 1. | bool_ 存储为一个字节的布尔值(真或假) |
| 2. | int8 字节(-128 ~ 127) |
| 3. | int16 16 位整数(-32768 ~ 32767) |
| 4. | int32 32 位整数(-2147483648 ~ 2147483647) |
| 5. | int64 64 位整数(-9223372036854775808 ~ 9223372036854775807) |
| 6. | uint8 8 位无符号整数(0 ~ 255) |
| 7. | uint16 16 位无符号整数(0 ~ 65535) |
| 8. | uint32 32 位无符号整数(0 ~ 4294967295) |
| 9. | float16 半精度浮点:符号位,5 位指数,10 位尾数 |
| 10. | float32 单精度浮点:符号位,8 位指数,23 位尾数 |
| 11. | float64 双精度浮点:符号位,11 位指数,52 位尾数 |
| 12. | complex64 复数,由两个 32 位浮点表示(实部和虚部) |
| 13. | complex128 复数,由两个 64 位浮点表示(实部和虚部) |
3.数组核心属性
3.1 数据类型dtype
代码如下:
t1=t1.astype("float16")
print(t1)
输出如下:
[1. 2. 4. 6. 3.]
3.2 形状shape
形状是指数组有几行几列
代码如下:
t4=np.array([[1,2,3,4],[5,6,7,8]])
print(t4)
print(t4.shape)
输出如下:
[[1 2 3 4]
[5 6 7 8]]
(2, 4)
修改形状
t4.reshape(4,2) #i维数组有i个数 一维数组(t,)
t4.flatten() #展开为一维数组
4.小数处理
代码如下:
t3=np.array([random.random()for _ in range(10)])
print(t3)
t3=np.round(t3,2) #保留两位小数
print(t3)
输出如下:
[0.57359887 0.20776735 0.01078815 0.63270212 0.01436111 0.50547448 0.54748582 0.80198859 0.96123989 0.77884493]
[0.57 0.21 0.01 0.63 0.01 0.51 0.55 0.8 0.96 0.78]
三、数组核心操作
1.索引和切片
NumPy 数组的切片是 “视图(View)” 而非 “副本(Copy)”,对视图的修改会直接作用于原数组。

代码如下:
import numpy as np
us="./US_video_data_numbers.csv" #本地数据
t1=np.loadtxt(us, dtype=int, delimiter=',')
print(t1)
print()
#取行和列 t1[行,列] [stat:stop:step]
print(t1[1,]) #取第一行
print()
print(t1[1,:]) #取第一行
print()
print(t1[2:,:]) #取连续的多行
print()
print(t1[[0,2],:]) #取不连续的多行
print()
print(t1[:,1]) #取第一列
print()
print(t1[:,2:]) #取连续的多列
print()
print(t1[:,[0,2]]) #取不连续的多列
print()
print(t1[2,3]) #取(2,3) type(t1[2,3])=<class 'numpy.int64'>
print()
print(t1[2:5,1:4]) #取二到四行,一到三列的交叉
print()
print(t1[[0,1,4],[0,0,3]]) #取(0,0) (1,0) (4,3)
输出如下:
[[4394029 320053 5931 46245]
[7860119 185853 26679 0]
[5845909 576597 39774 170708]
...
[ 142463 4231 148 279]
[2162240 41032 1384 4737]
[ 515000 34727 195 4722]]
[7860119 185853 26679 0]
[7860119 185853 26679 0]
[[5845909 576597 39774 170708]
[2642103 24975 4542 12829]
[1168130 96666 568 6666]
...
[ 142463 4231 148 279]
[2162240 41032 1384 4737]
[ 515000 34727 195 4722]]
[[4394029 320053 5931 46245]
[5845909 576597 39774 170708]]
[320053 185853 576597 ... 4231 41032 34727]
[[ 5931 46245]
[ 26679 0]
[ 39774 170708]
...
[ 148 279]
[ 1384 4737]
[ 195 4722]]
[[4394029 5931]
[7860119 26679]
[5845909 39774]
...
[ 142463 148]
[2162240 1384]
[ 515000 195]]
170708
[[576597 39774 170708]
[ 24975 4542 12829]
[ 96666 568 6666]]
[4394029 7860119 6666]
2. 数值的修改
代码如下:
import numpy as np
t2=np.arange(24).reshape(4,6)
print(t2)
print()
#令二到三列等于0
t2[:,2:4]=0
print(t2)
print()
print(t2<10)
print()
#令小于10的等于0
t2=np.arange(24).reshape(4,6)
t2[t2<10]=0 #布尔索引
print(t2)
print()
# np.where(condition, x=None, y=None) condition:类数组,布尔型。当为 True 时,生成x,否则生成y。
t2=np.arange(24).reshape(4,6)
print(np.where(t2<=3,100,300))
print()
#令小于10的等于10,令大于20的等于20
print(t2.clip(10,20)) #剪裁
输出如下:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 0 1 0 0 4 5]
[ 6 7 0 0 10 11]
[12 13 0 0 16 17]
[18 19 0 0 22 23]]
[[ True True True True True True]
[ True True True True False False]
[False False True True False False]
[False False True True False False]]
[[ 0 0 0 0 0 0]
[ 0 0 0 0 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[100 100 100 100 300 300]
[300 300 300 300 300 300]
[300 300 300 300 300 300]
[300 300 300 300 300 300]]
[[10 10 10 10 10 10]
[10 10 10 10 10 11]
[12 13 14 15 16 17]
[18 19 20 20 20 20]]
2.4数组的拼接与转置
数组之间既能拼接也能分割。拼接分为竖直拼接和水平拼接。
代码如下:
np.vstack(t1,t2) #竖直
np.hstack(t1,t2) #水平
行列交换和python交换两个数字类似
补充: numpy中的转置:
代码如下:
t1=np.arange(24).reshape(4,6)
print(t1)
print()
print(t1.transpose())
print()
print(t1.swapaxes(0,1)) #交换0轴和1轴
print()
print(t1.T)
输出如下:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 0 6 12 18]
[ 1 7 13 19]
[ 2 8 14 20]
[ 3 9 15 21]
[ 4 10 16 22]
[ 5 11 17 23]]
[[ 0 6 12 18]
[ 1 7 13 19]
[ 2 8 14 20]
[ 3 9 15 21]
[ 4 10 16 22]
[ 5 11 17 23]]
[[ 0 6 12 18]
[ 1 7 13 19]
[ 2 8 14 20]
[ 3 9 15 21]
[ 4 10 16 22]
[ 5 11 17 23]]
四、数组计算与统计
1.计算(广播原则)
代码如下:
t5=np.arange(24).reshape(4,6)
t6=np.arange(100,124).reshape(4,6)
t7=np.arange(6)
t8=np.arange(4).reshape(4,1)
print (t5)
print(t5+2)
print(t5/0) #两种结果0/0=nan,3/0=inf(无穷)
#数组与数组之间计算为对应计算
print(t6+t5)
print(t5-t7)
print(t5-t8)
输出如下:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 2 3 4 5 6 7]
[ 8 9 10 11 12 13]
[14 15 16 17 18 19]
[20 21 22 23 24 25]]
[[nan inf inf inf inf inf]
[inf inf inf inf inf inf]
[inf inf inf inf inf inf]
[inf inf inf inf inf inf]]
[[100 102 104 106 108 110]
[112 114 116 118 120 122]
[124 126 128 130 132 134]
[136 138 140 142 144 146]]
[[ 0 0 0 0 0 0]
[ 6 6 6 6 6 6]
[12 12 12 12 12 12]
[18 18 18 18 18 18]]
[[ 0 1 2 3 4 5]
[ 5 6 7 8 9 10]
[10 11 12 13 14 15]
[15 16 17 18 19 20]]
2.常用统计函数
常见的统计函数有求和、求平均值、求中值、求最大值、求最小值、求极差、求标准差和求方差。默认返回多维度数组的全部统计结果,可以指定axis。
代码如下:
import numpy as np
t=np.arange(24).reshape(4,6)
print(t.sum()) #求和
print(t.sum(axis=0))
print(t.sum(axis=1))
print(t.mean()) #求平均值
print(np.median(t)) #求中值
print(t.max()) #求最大值
print(t.min()) #求最小值
print(np.ptp(t)) #求极差
print(t.std()) #求标准差
print(t.var()) #求方差
输出如下:
276
[36 40 44 48 52 56]
[ 15 51 87 123]
11.5
11.5
23
0
23
6.922186552431729
47.916666666666664
五、读取本地数据
代码如下:
loadtxt(fname, dtype=float, delimiter=None, skiprows=0, usecols=None, unpack=False)
六、特殊值(nan/inf)处理
1.nan/inf的特性与检测
nan(not a number):(1) 0/0 (2) 数据缺失 (3) 不合适的计算
inf(-inf,inf):无穷
均为浮点型
注: nan!=nan
代码如下:
import numpy as np
t1=np.arange(24).reshape(4,6).astype(float)
t1[[0,1,2],[2,1,0]]=np.nan
print(t1)
print(np.count_nonzero(t1)) #统计非零个数 count_nonzero(a, axis=None, *, keepdims=False)
print(t1!=t1)
print(np.count_nonzero(t1!=t1))
print(np.isnan(t1)) #判断元素是否为nan
print(np.count_nonzero(np.isnan(t1)))
输出如下:
[[ 0. 1. nan 3. 4. 5.]
[ 6. nan 8. 9. 10. 11.]
[nan 13. 14. 15. 16. 17.]
[18. 19. 20. 21. 22. 23.]]
23
[[False False True False False False]
[False True False False False False]
[ True False False False False False]
[False False False False False False]]
3
[[False False True False False False]
[False True False False False False]
[ True False False False False False]
[False False False False False False]]
3
2.nan的填充与清洗
一般将nan(缺失的数据)替换为均值(或中值)或者直接删去缺失值的一行
nan和任何值计算都为nan
将nan替换为均值, 代码如下:
import numpy as np
def fill_nan_with_mean(arr):
"""用每列的均值填充数组中的NaN值"""
# 遍历数组的每一列
for i in range(arr.shape[1]):
# 取第i列的视图(非副本)
temp_col = arr[:, i]
# 计算该列非nan值的均值
col_mean = np.nanmean(temp_col)
# 通过视图直接修改原数组的nan值
temp_col[np.isnan(temp_col)] = col_mean
return arr
t=np.arange(24).reshape(4,6).astype(float)
t[1,2:]=np.nan
print(t)
print(fill_nan_with_mean(t))
输出如下:
[[ 0. 1. 2. 3. 4. 5.]
[ 6. 7. nan nan nan nan]
[12. 13. 14. 15. 16. 17.]
[18. 19. 20. 21. 22. 23.]]
[[ 0. 1. 2. 3. 4. 5.]
[ 6. 7. 12. 13. 14. 15.]
[12. 13. 14. 15. 16. 17.]
[18. 19. 20. 21. 22. 23.]]
对fill_nan_with_mean函数的理解:
这段代码不用 “额外修改 t1” 的核心原因是:NumPy 数组的切片是 “视图(View)” 而非 “副本(Copy)”,对视图的修改会直接作用于原数组。
具体拆解:
1.代码中temp_col = t1[:, i]是取t1的第i列 —— 但 NumPy 中这种切片操作返回的是原数组的 “视图”(可以理解为原数组的 “引用 / 窗口”),不是独立的新数组。
2.后续对temp_col的操作(比如temp_col[np.isnan(temp_col)] = …),本质是通过 “视图” 直接修改了原数组t1中对应列的内容。
所以函数内看似操作的是temp_col,实际已经间接修改了传入的t1本身,因此不需要再额外写 “修改 t1” 的代码。
七、NumPy拓展实用方法
代码如下:
np.argmax(a, axis=None) #最大值的位置
np.argmin(a, axis=None) #最小值的位置
np.zeros(shape, dtype=None) #创建一个全是0的数组
np.ones(shape, dtype=None) #创建一个全是1的数组
np.eye(n) #创建一个对角线为1的方阵
补充:生成随机数

总结
NumPy 是 Python 中用于科学计算的核心库,其核心是高效的多维数组(ndarray)。本大纲系统梳理了 NumPy 的学习路径:
1.从基础概念出发,先理解 NumPy 的定位与价值;
2.围绕数组展开核心操作,包括创建数组、调整类型、处理形状、应用广播原则计算及统计分析;
3.延伸到实际场景,如本地数据读取、索引切片、数值修改与数组拼接;
4.针对浮点型特殊值(nan、inf)的处理方法,补全数据清洗环节;
5.最后扩展更多实用方法,为深入应用奠定基础。
&spm=1001.2101.3001.5002&articleId=155282645&d=1&t=3&u=532caccac73644ce8954608e7abb2ffe)
308

被折叠的 条评论
为什么被折叠?



