数据分析(numpy)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

上一节学习了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.最后扩展更多实用方法,为深入应用奠定基础。

NumPy和Pandas是Python中两个用于数据分析的重要库。NumPy是一个数学库,提供了多维数组对象和用于处理这些数组的函数。它是大多数数据科学工具和库的基础。Pandas是一个数据处理和分析库,它建立在NumPy之上,提供了用于处理和操作结构化数据的高级数据结构和函数。 NumPy的主要特点是它的多维数组对象(也称为ndarray),它可以存储相同类型的元素。这使得NumPy非常适合进行数学和统计计算,以及处理大规模数据集。NumPy还提供了许多用于数组操作的函数,包括索引、切片、聚合操作、线性代数、傅里叶变换等。在数据分析中,NumPy常用于数据清洗、转换和计算。 Pandas是基于NumPy构建的,它提供了两个主要的数据结构:Series和DataFrame。Series是一维标记数组,类似于带有标签的NumPy数组。DataFrame是一个二维表格,类似于Excel或SQL表。Pandas提供了丰富的功能,包括数据的读取和写入、数据清洗、数据过滤、数据聚合、数据可视化等。 Pandas的优势在于它的表格结构和灵活的数据处理能力。它可以处理不同类型的数据(整数、浮点数、字符串等),并且可以进行缺失值处理和重复值处理。此外,Pandas还提供了强大的数据操作功能,如合并、拼接、分组和透视等。 综上所述,NumPy和Pandas是两个在数据分析中广泛使用的Python库,它们提供了高效的数据处理和分析工具,能够满足不同场景下的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值