欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习笔记(一):python 模块 numpy

程序员文章站 2023-12-27 18:15:33
...

今天开始系统的学习机器学习了, 写下这个笔记,作为自我监督,也希望能帮到同在学习的人。

要学机器学习,少不了数学和计算,先从学习和使用python 开始吧。

python关系数学计算的numpy就是我首先学习的,之前接触过matlab,所以会觉得numpy非常的相似。

1。numpy读取txt文件 genfromtxt(’ 文件地址 ’ , delimiter=’分隔符 ’ , dtype=数据类型)

第一个参数可以是相对地址,或者绝对地址。 分隔符一般就是‘,‘ 或者‘ ‘ 具体根据文件中的存储规则来,第三个参数指的是文件中存储的数据读取到python后的数据类型。

程序:

 文件中的内容
     hello I'm chenxiaoze
     where are you

代码:

import numpy as np
A = np.genfromtxt('/Users/Chenxz/Desktop/2.txt',delimiter=' ',dtype='str')
print(A)

得到的是一个数组:

[['hello' "I'm" 'chenxiaoze']
 ['where' 'are' 'you']]

这个方法在对大量规则存储的文件有奇效,目前接触到的读取文件的方法只有这一种,以后接触到了会陆续补充。

2。矩阵

矩阵可以说是线性代数中巨大的一块了,也是机器学习中异常丰富的存在。

构造一个矩阵:(矩阵的成员需要时同一类型)

import numpy
A = numpy.array([1,2,3])   #一维矩阵(向量)
B = numpy.array([[1,2,3],[4,5,6],[7,8,9]]) #二维矩阵 

构造一些特殊的矩阵:

import numpy as np
#全0矩阵 
A = np.zeros((1,3))   #[[ 0.  0.  0.]]0矩阵 
print('A中元素的类型是:',A.dtype,A.dtype.name) #float64默认类型
#全1矩阵
B = np.ones(3)   #[ 1.  1.  1.]  全1矩阵   一个参数默认1行
B = np.ones((2,2))  #[[ 1.  1.]
                    # [ 1.  1.]]
#随机矩阵
C = np.random.random((2,2)) #随机矩阵  随机构造0-1内的22列矩阵   
D = np.arange(10)    #产生0-9整数[0 1 2 3 4 5 6 7 8 9]
import math
E = np.linspace(0,2*math.pi,10)  #在0-2pi之间平均找10个数  不包括2pi 即>=0   <2pi
print(E)

矩阵取值

A[0]  
B[2] #表示整个第37.8.9
B[1,2] #第二行第36

print(B[[1,1],[2,2]])   #输出 B[12] 和 B[1,2]

#下面是用true取值
Arr = numpy.array([1,2,3,2,2]) 
A = Arr == 2     # 得到: [False  True False  True  True]
print(A)
print(Arr[[False,True,False,True,True]])   # 竟然也可以这样取值
print(Arr[A])   #所以这样也行
print(Arr[Arr]) #[2 3 2 3 3]    厉害了吧

矩阵的一些属性值

print(B.mean(),B.max(),B.min()) # 矩阵中   平均值 ,最大值 ,最小值

print(A.ndim)  #查看维数 1
print(B.ndim)  #2
print('B的行数烈数: ',B.shape)  #求矩阵的行数列数,返回的是tuple类型   B:  (3, 3)
print('B中总的元素个数:',B.size)  #9
print('A中元素的类型是:',A.dtype) #int64

矩阵运算:

import numpy as np
A = np.array([[1,1],[2,2]])
B = np.array([[3,3],[4,4]])

print(A.ravel())  #[1 1 2 2]二维=>一维   把矩阵=>向量


print(A*B)     #同位置的元素相乘   [[3 3],[8 8]]
print('方法1:',A.dot(B),'方法2:',np.dot(A,B))  #矩阵的乘法 , 左行右列,两种方法都行 [[ 7  7],[14 14]]

print(np.exp(A))   #对A中每个元素x都  e^x 然后返回值
print(np.sqrt(A))  #对A中每个元素x都 开方

矩阵拆分

#矩阵拼接  (水平拼接 ,垂直拼接)
'''
A= 1  1     B = 3  3
   2  2         4  4
'''  
C = np.hstack((A,B))   #[[1, 1, 3, 3],
                       # [2, 2, 4, 4]]) 
D = np.vstack((A,B))      #  [[1, 1],
                          #  [2, 2],
                          #  [3, 3],
                          #  [4, 4]]
#矩阵拆分  (水平拆分 ,垂直拆分)
np.hsplit(C,2)   #把C在水平方向拆成2份   hsplit(C,3)报错,因为C的行数不是3的倍数
'''
                    [array([[1, 1],
                            [2, 2]]), array([[3, 3],
                                             [4, 4]])]
'''

np.vsplit(C,2)   # [array([[1, 1, 3, 3]]),  array([[2, 2, 4, 4]])]
np.hsplit(C,(1,2))   #水平方向上(第一列,第二列后面切一刀)
'''
                    [array([[1],
                            [2]]), array([[1],
                                          [2]]), array([[3, 3],
                                                        [4, 4]])]
'''

矩阵复制

#矩阵复制

#1. A就是B ,B就是A,相当于别名  (诸葛亮和孔明)

A= np.array([[1,1],[2,2]])
B = A;
A[1,1] = 100
#A变 B也会变
print(B)   #[[  1   1]
          #  [  2 100]]

print(A is B,id(A),id(B))  #True 4621128128 4621128128   两者完全相同


#2. A,B 不同,但是指向的地方一样 (诸葛亮和关羽,都是为了刘家天下)

A= np.array([[1,1],[2,2]])
B = A.view()
A[1,1] = 100
#A变 B也会变   刘备死了,诸葛亮和关羽虽然不是一个人但是都不开心
print(B)   #[[  1   1]
          #  [  2 100]]

print(A is B,id(A),id(B))      # False 4620750160 4621128128
#3  A,B完全不同
A= np.array([[1,1],[2,2]])
B = A.copy()
A[1,1] = 100

#A变 B不变
print(B)   #[[  1   1]
          #  [  2   2]]
print(A is B,id(A),id(B))      # False 4621128128 4621147072

矩阵的一些操作:

A.T   #转置A
#矩阵元素类型转换 可以连续转换
A.astype(int).astype(float)  #bool = > int => float

import numpy as np
A = numpy.array([5,1,2,3])   #一维矩阵(向量)
B = numpy.array([[4,5,6],[1,2,3],[7,8,9]]) #二维矩阵 

B.sum()  # 全部求和
B.sum(0) # [12, 15, 18]   每一列求和
B.sum(1) # array([15,  6, 24])  每一行求和

A.reshape(1,4)    #array([[5, 1, 2, 3]])  重新设置行列,但是size不能改变,即总元素不变
B.argmax()  #和下面的一样
np.argmax(B)  #  8  找到最大那个值的下标,因为二维返回的也是一个数字,所以不方便

B = numpy.array([[4,15,6],[1,2,13],[7,8,9]]) 

# [ 4, 15,  6],
# [ 1,  2, 13],
# [ 7,  8,  9]

B.argmax(0) #  [2, 0, 1]      每一列的最大值的坐标 (2,0)  (0,1)  (1,2)

print(B[B.argmax(0),np.arange(0,B.shape[1])])  #[ 7 15 13]

np.argmax(B,1)  #  [1, 2, 2】  每一行的最大值  (0,1)  (1,2)  (2,2)
print(B[np.arange(0,B.shape[1]),B.argmax(1)])   #[15 13  9]

矩阵扩展

机器学习笔记(一):python 模块 numpy

矩阵排序:

import numpy as np
B = numpy.array([[4,5,6],[1,2,3],[7,8,9]]) #二维矩阵 

#每一列排序后的下标
C = numpy.argsort(B,0)   #[1, 1, 1],
                         #[0, 0, 0],
                         #[2, 2, 2]   对应的是数字的下标

#每一行排序后的下标
D = numpy.argsort(B,1)    #[0, 1, 2],
                          #[0, 1, 2],
                          #[0, 1, 2]]
相关标签: python numpy

上一篇:

下一篇: