python与机器学习(二)Numpy / Pandas /矩阵相乘速度对比

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值