NumPy(Numerical Python)是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy的官方文档:https://numpy.org/doc/stable/reference/index.html
Pandas是一个强大的分析结构化数据的工具集,它的使用基础是NumPy(提供高性能的矩阵运算),用于数据挖掘和数据分析,同时也提供数据清洗功能。
Pandas的官方文档:https://pandas.pydata.org/docs/
实验 1 NumPy数组基本操作
用NumPy生成长度为20的全1一维数组(向量) a ,然后将其变形为4×5的二维数组(矩阵)形式
提示:使用np.ones、reshape()函数
a = None
a = np.ones(20)
print("a:\n",a)
b = a.reshape((4,5),order = 'A')
print("b:\n",b)
运行结果如下:
a:
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
b:
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
用NumPy随机生成数值呈正态分布的5×6二维数组(矩阵) b ;然后将数值小于0的元素变为0,数值不小于0的元素变为1
提示:使用np.random.randn函数
b = None
b = np.random.randn(5,6) #随机生成数值呈正态分布的5×6二维数组(矩阵)b
print("b:\n",b) #打印
for i in range(len(b)): #改变元素的值
for j in range(len(b[0])):
if(b[i][j] >= 0):
b[i][j] = 1
else:
b[i][j] = 0
print("b:\n",b) #打印改变过的二维矩阵
运行结果如下:
b:
[[ 0.42750409 0.24876996 1.20965927 -0.27640069 1.62989209 -2.876562 ]
[-0.54868323 -0.83376206 -1.78829935 1.09605845 -0.01247058 0.07712765]
[-0.51337788 -1.23734978 -0.79213691 -0.53300128 1.06409793 0.39170247]
[-1.17350612 0.26889677 1.18307913 0.93361501 0.82088702 -0.35686145]
[ 0.29695482 0.22552731 -0.24845305 1.67563496 -1.42120198 -1.25502105]]
b:
[[1. 1. 1. 0. 1. 0.]
[0. 0. 0. 1. 0. 1.]
[0. 0. 0. 0. 1. 1.]
[0. 1. 1. 1. 1. 0.]
[1. 1. 0. 1. 0. 0.]]
实验 2 矩阵相乘速度对比
分别随机生成大小为100×1000的矩阵 A 和大小为1000×200的矩阵 B
提示:使用np.random.rand或np.random.randn函数
生成两个矩阵
A = None
A = np.random.randn(100,1000)
B = None
B = np.random.randn(1000,200)
使用NumPy的矩阵相乘函数计算结果 C=A×B
提示:使用np.dot函数
time1 = time.time()
C = None
C = np.dot(A,B)
time2 = time.time()
print('{:.3f}ms'.format((time2-time1)*1000))
运行结果如下:
43.548ms
使用3重for循环模拟矩阵相乘计算结果 D=A×B
time1 = time.time()
D = np.zeros((A.shape[0], B.shape[1]))
for i in range(A.shape[0]):
for j in range(B.shape[1]):
for k in range(A.shape[1]):
D[i][j] += A[i][k] * B[k][j]
time2 = time.time()
print('{:.3f}ms'.format((time2-time1)*1000))
运行结果如下:
17595.771ms
验证一下这两种方法做出的结果是否一致
print(abs(D-C))
运行结果如下:
[[2.13162821e-14 2.84217094e-14 7.10542736e-15 ... 1.77635684e-14
2.75335310e-14 5.32907052e-15]
[0.00000000e+00 7.81597009e-14 8.88178420e-15 ... 1.42108547e-14
3.19744231e-14 0.00000000e+00]
[2.48689958e-14 3.10862447e-14 7.32747196e-15 ... 3.55271368e-14
2.13162821e-14 7.10542736e-15]
...
[2.13162821e-14 1.15463195e-14 7.10542736e-15 ... 7.81597009e-14
5.68434189e-14 4.97379915e-14]
[3.90798505e-14 1.42108547e-14 7.10542736e-15 ... 4.97379915e-14
2.13162821e-14 4.97379915e-14]
[0.00000000e+00 8.88178420e-15 1.06581410e-14 ... 1.15463195e-14
1.24344979e-14 1.06581410e-14]]
注意到这里的误差已经足够小。
实验 3 Pandas基本操作
使用Pandas读取data.csv文件,输出数据的维度,查看数据的前10行(注意列名不能为原数据)
提示:使用pd.read_csv、shape、head函数
import pandas as pd
data = None
CSV_FILE_PATH = 'data.csv'
csv_data = pd.read_csv(CSV_FILE_PATH,header=None)
print(csv_data.shape,"\n\n\n")
print(csv_data.head(10))
运行结果如下:
(100, 5)
0 1 2 3 4
0 0.751467 0.536850 0.088547 0.717778 1
1 0.174956 0.853711 0.825316 0.249155 0
2 0.536223 0.835790 0.540562 0.246308 1
3 0.836582 0.124468 0.039970 0.693927 1
4 0.686294 0.636168 0.542874 0.019389 1
5 0.070402 0.907882 0.891519 0.645994 1
6 0.497347 0.373515 0.707714 0.155490 1
7 0.322959 0.285857 0.394315 0.282622 0
8 0.061755 0.279301 0.270008 0.149885 0
9 0.587104 0.645545 0.608420 0.174640 0
其中"data.csv"数据如下所示:
分离出数据的标签列(最后一列)
label = None
last_list = csv_data.iloc[:,-1]
print(last_list)
运行结果如下:
0 1
1 0
2 1
3 1
4 1
5 1
6 1
7 0
8 0
9 0
10 1
11 0
12 1
13 1
14 1
15 0
16 0
17 1
18 1
19 1
20 1
21 0
22 0
23 0
24 0
25 1
26 1
27 1
28 1
29 1
..
70 1
71 1
72 1
73 0
74 0
75 1
76 0
77 0
78 0
79 0
80 1
81 0
82 1
83 0
84 1
85 1
86 0
87 1
88 1
89 0
90 1
91 1
92 0
93 1
94 0
95 1
96 1
97 1
98 1
99 1
Name: 4, Length: 100, dtype: int64
统计数据为0的数量
num = 0
for i in range(0,99,1):
if last_list[i] == 0:
num = num + 1
print("the number of 0 is:",num)
运行结果如下:
the number of 0 is: 40