numpy api简单说明和使用

1.flatten和ravel的区别

它们都是拆分多维数组变一维的

In [3]: arr = np.asarray([[1,2],[3,4]])


In [4]: arr

Out[4]: 

array([[1, 2],

       [3, 4]])


In [5]: m = arr.flatten()


In [6]: m

Out[6]: array([1, 2, 3, 4])


In [7]: n = arr.ravel()


In [8]: n

Out[8]: array([1, 2, 3, 4])

两者的区别在于

由ravel拆分的数组n改变会影响原来的值,而flatten改变不会影响原值

In [10]: n[1]  = 10


In [11]: arr

Out[11]: 

array([[ 1, 10],

       [ 3,  4]])

In [12]: m[1] = 12


In [13]: arr

Out[13]: 

array([[ 1, 10],

       [ 3,  4]])


2.C_函数

列相加

In [15]: np.c_[m,n]

Out[15]: 

array([[ 1,  1],

       [12, 10],

       [ 3,  3],

       [ 4,  4]]

对于上面的m,n拼接起来就是这个

3.ones生成全是1的数组根据ones(shape,dtype,order) shape来,dtype决定数据格式

4.np.exp(x) , 传进去的是一个值则返回e^x,如果是个矩阵则对每次值求一次e^x

5.np.log(x) 等于数学表达式logx

6.np.isnan(x) 判断x是否为一个数字,比较奇怪的是,如果是数字它返回False,否则返回Ture,并且不支持字符之类的,能被判True我目前只知道float(inf) 正无穷 -float(inf)负无穷 float(nan)

7.np.dot

arr1 = np.asarray([1,2,3,4,5,6])
arr2 = np.asarray([1,2,3,4,5,6])
print(np.dot(arr1,arr2))
print(arr1.dot(arr2))
print(arr1.T.dot(arr2))

这三种调用方式都是一样的得到91,也就是两个向量的内积

特别注意下,如果是用mat生成的矩阵,是无法用这个的,即使用第三种成功了,也只是个6阶矩阵而不是内积

8.[:, x]说说这个语法这个是取矩阵的第x列

   [:, x:y]则是取x-y列,闭合区间是[x,y)比如下面这个数组是2是无法取到3,4,8的

import numpy as np
arr = np.asarray([[1,2,3],[2,3,4],[6,7,8]])
print(arr[:,1])
print(arr[:,0])
print(arr[:,2])
[2 3 7]
[1 2 6]

[3 4 8]

结果如上

9.np.linspace(start,end,count,startpoint,endpoint,dtype)count 默认为50, 设置起始值,会生成一个等比的数据为50,范围在start-end的数组,后面startpoint,endpoint的是bool值,包不包含起始点.dtype为数据类型比如

arr , gap = np.linspace(10,20,50,True,True,float)
print(arr)
print(gap)
[10.         10.20408163 10.40816327 10.6122449  10.81632653 11.02040816
 11.2244898  11.42857143 11.63265306 11.83673469 12.04081633 12.24489796
 12.44897959 12.65306122 12.85714286 13.06122449 13.26530612 13.46938776
 13.67346939 13.87755102 14.08163265 14.28571429 14.48979592 14.69387755
 14.89795918 15.10204082 15.30612245 15.51020408 15.71428571 15.91836735
 16.12244898 16.32653061 16.53061224 16.73469388 16.93877551 17.14285714
 17.34693878 17.55102041 17.75510204 17.95918367 18.16326531 18.36734694
 18.57142857 18.7755102  18.97959184 19.18367347 19.3877551  19.59183673
 19.79591837 20.        ]

0.20408163265306123

gap为步长,就是两个数之间的差距,如果只传start和end是不会生成步长的

10.np.meshgrid这个函数我目前理解的也不是特别深,只知道它可以根据2个一维数组生成一个3维数组,注意不是3阶是三维

格式2*len(arr1)*len(arr2)这种格式,后期深入了再来补充

11..np.arange(x)生成一个0-(x-1)的一维数组

12.np.random.random((x,y)) 生成一个x*y阶的数组

13.print(arr1.dtype) 打印出arr1的数据类型

14.arr1.astype(np.float64)进行类型强转输出来不是之前的int,而是变成了float

15.arr2[np.arange(4),b] += 10  切片元素+10

16.na = arr2 > 0.5 把arr2根据里面的值转成bool矩阵,其中大于0.5为true,小于或等于为false,

   然后用这个矩阵na做下标s_arr = arr2[na],这样得出来的s_arr就是会取出所有符合>0.5的元素,

   如果嫌麻烦arr2[[arr2 > 0.5]]这也可以实现

科学计算

 
  
matrix_a = np.array([[1,2],[3,4]],dtype=int)
matrix_b = np.array([[5,6],[7,8]],dtype=float)
hybird = matrix_a + matrix_b  print(hybird) print(np.add(matrix_a,matrix_b)) #点对点相加,所以必须是相同阶的数组
  hybird = matrix_a - matrix_b
  print(hybird)
  print(np.add(matrix_a,matrix_b))   #减 点对点相减,所以必须是相同阶的数组
  hybird = matrix_a * matrix_b
  print(hybird)
  print(np.multiply(matrix_a,matrix_b)) #乘
  hybird = matrix_a / matrix_b
  print(hybird)
  print(np.divide(matrix_a,matrix_b))   #除
  print(np.sqrt(matrix_a)) #对a所有元素开根号
arr = np.arange(20)
print(arr.reshape((2,5,2)))  #把一个一维数组改成3维,但改变后的数据和改变之前的数据必须是一样的,比如2,3,2这种数组就需要12个元素
arr = np.arange(20)
arr = arr.reshape((2,5,2))
print(arr)
print(">>>>>>>>>>>>>>>>>>>>",arr.transpose((1,0,2)))   #把之前的纬度进行改变,改变之后变成5,2,2,比如对二维矩阵而言5*2改变成1,0就会变成2*5阶
arr = np.arange(30)
arr = arr.reshape((2,5,3))
print(arr.transpose((2,1,0)))
print(">>>>>>>>>>>>>>>>>>>>",arr.swapaxes(0,2))  #swapaxes和transpose的效果类似,不同的是,swapaxes是指定的列交换,而transpose需要传入所有列,用数字排序
arr = np.arange(12).reshape((-1,3))
print(arr)
print(sum(arr))           #可见python原生的sum只会把列相加生成一个一维数组
print(arr.sum())          #而np的sum会把所有元素相加,
print(np.sum(arr))        #生成一个整形,arr.sum()和np.sum(arr)是一样的, 
print(np.sum(arr,axis = 0))  #axis = 0 则列相加,和python原生sum是一样的效果,1为行相加
arr = np.arange(12).reshape((-1,3))
print(np.mean(arr))
print(np.mean(arr,axis=0))
print(np.mean(arr,axis=1))      #首先mean是求平均数,axis0和1分别是求列平均数和行平均数
arr = np.arange(12).reshape((-1,3))
print(np.cumsum(arr)) #生成一个相加的数组,后面的数为前面数之和
print(np.cumsum(arr,axis=0)) #列相加新数为数上面一个数加原本这个位置的数,然后生成的新数
print(np.cumsum(arr,axis=1)) #行相加,逻辑与上面一样
arr = np.arange(12).reshape((-1,3))
print(np.cumprod(arr))  #生成一个相乘的数组,后面的数为前面数相乘的结果
print(np.cumprod(arr,axis=0))  #列相乘新数为数上面一个数乘原本这个位置的数
print(np.cumprod(arr,axis=1))  #行相乘新数为数上面一个数乘原本这个位置的数
arr = (np.random.randn(10) * 10)
arr.sort()
print(arr)            #生成一个排序好的数组
arr = (np.random.randn(3,4) * 10)
arr.sort(0)                #对于多维数组0为列排序,1为行排序
print(arr)    
arr = np.arange(20).reshape((4,5))
print(np.zeros_like(arr))                    #生成一个和arr同阶的相似矩阵
mat_a = np.arange(0,5)
mat_b = np.arange(5,10)
b_arr = [True,False,True,False,True]
print(np.where(b_arr,mat_a,mat_b))            #where这个函数会根据True,False分别从mat_a和mat_b中取值,所以它们需要是同维同阶的
arr = np.random.randn(4,3)
n_a = np.where(arr > 0 , 1 , -1)
print(n_a)                                    #根据where的特性,可以使原来的连续矩阵转成二项分布
arr1 = np.arange(9).reshape((-1,3))
arr2 = np.arange(9,18).reshape((-1,3))
hybird_arr = np.concatenate((arr1,arr2),axis=0)
print(hybird_arr)                              #合并成一个数组比如2*2 +2*2如果是行合并就变成4*2,如果列合并就变成2*4,合成的列或者行必须相等,否则报错

arr1 = np.arange(9).reshape((-1,3))
arr2 = np.arange(9,18).reshape((-1,3))
# hybird_arr = np.vstack((arr1,arr2))   #veritical 垂直合并也就是上下合并,也就是行合并
hybird_arr = np.hstack((arr1,arr2))     #horizontal 水平合并,也就是列合并
print(hybird_arr)
arr = np.arange(36).reshape((6,6))
print(arr)
one,two,three = np.split(arr,[1,3],axis=1)        #老规矩axis可以为0页可以为1,0是行分割,割掉的部分给two,之前的给one,后面的给three
print(one)
print(two)
print(three)

arr = np.arange(3)
print(arr.repeat(3))                        #延长三倍注意不是123形式比如arr是[0,1,2]生成的是[0,0,0,1,1,1,2,2,2]
print(arr.repeat((2,3,4)))       #也可以按元素个数填需要的倍数 ,比如arr是[0,1,2]生成的是[0,0,1,1,1,2,2,2,2]
arr = np.arange(6).reshape((2,3))
print(arr.repeat(3,axis = 0))
print(arr.repeat((2,3),axis = 0))            #对于多维数组repeat则需要加axis了,老规矩0是行,1是列[[0 1 2]
 [0 1 2]
 [0 1 2]
 [3 4 5]
 [3 4 5]
 [3 4 5]]
[[0 1 2]
 [0 1 2]
 [3 4 5]
 [3 4 5]
 [3 4 5]]
arr = np.random.rand(2,2)
print(np.tile(arr,2))            #水平方向扩张一份变成2倍
print(np.tile(arr,(2,3)))        #垂直方向变成2倍,水平方向变成3倍
arr = np.loadtxt("test1.txt",delimiter = ',')    #读取一个当前文件夹下的一个叫test1.txt的文本,
print(arr)    #注意一定得是这个.py文件同文件夹下的,同时必须有test1.txt这个文件,delimiter表示文本里面数据的分割方式
arr = np.random.rand(10000,7) *10000
np.savetxt('sth.txt',arr,delimiter='-')    #将一个二维数组写入txt













你可能感兴趣的:(机器学习基础算法)