机器学习数据科学包第1天

numpy

是一种基于矩阵的运算,提高了运算效率

numpy的一些基本属性

In[3]: import numpy as np
In[4]: array=np.array([[1,2,3],[2,3,4]])
In[5]: print('number of dim:',array.ndim) #打印array矩阵的维度
number of dim: 2
In[6]: print('shape:',array.shape) #打印array矩阵的形状
shape: (2, 3)
In[7]: print('size:',array.size) #打印array矩阵的形状
size: 6

numpy中创建array

一般方法

In[8]: a=np.array([[1,2],[3,4]]) #一般方法创建
In[9]: print(a) #和列表打印唯一的区别是,元素之间没逗号隔开
[[1 2]
 [3 4]]

规定类型:定义时在构造函数括号里面加一个dtype参数,如dtype=np.int,还可以是np.float,np.int32,np.float64…,np.int默认情况下等于np.int64

In[11]: a=np.array([[1,2],[3,4]],dtype=np.float64) 
In[12]: print(a) 
[[1. 2.]
 [3. 4.]]
 In[13]: print(a.dtype)
float64

一些特殊的方式创建
np.zeros(形状):创建所有元素都是0的矩阵
np.ones(形状):创建所有元素都是1的矩阵
np.empty(形状):创建所有元素都是接近0或等于0的小数的矩阵
(可能是显示的原因,在控制台输出的全是0,如果单独写一个脚本文件运行则是许多接近0的小数)

In[14]: a=np.zeros((3,4))
In[15]: print(a)
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
In[16]: a=np.ones((3,4),dtype=np.int)
In[17]: print(a)
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]
In[18]: a=np.empty((3,4))
In[19]: print(a)
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

np.arange(m,n,i):生成从m到n(包括m不包括n)的步长是i的矩阵
矩阵.reshape(形状):重新更改矩阵的形状,前提是元素个数相同
np.linespace(m,n,i):从m到n(包括m包括n)生成i段(即元素个数是i)的矩阵

In[22]: print(np.arange(1,10,2))
[1 3 5 7 9]
In[23]: print(np.arange(1,10,2).reshape((5,1)))
[[1]
 [3]
 [5]
 [7]
 [9]]
 In[25]: print(np.linspace(1,10,4))
[ 1.  4.  7. 10.]
In[26]: print(np.linspace(1,10,4).reshape(2,2))
[[ 1.  4.]
 [ 7. 10.]]

numpy的运算

加减乘除:矩阵之间基于+ - * / 甚至**(次方运算),都是两个矩阵每个位置的对应元素做相关运算再得出结果

In[4]: a=np.array([10,20,30,40])
In[5]: b=np.arange(1,5)
In[6]: print(a+b)
[11 22 33 44]
In[7]: print(a-b)
[ 9 18 27 36]
In[8]: print(a*b)
[ 10  40  90 160]
In[9]: print(a/b)
[10. 10. 10. 10.]
In[10]: print(a**2)
[ 100  400  900 1600]

一些数学中特殊的运算在numpy中有对应函数,如np.sin(),np.cos,np.tan()等等

In[15]: print(np.sin(np.pi/6))
0.49999999999999994

numpy可以通过一些特殊快速看出矩阵中符合某些条件的元素

In[16]: print(a)
[10 20 30 40]
In[17]: print(a<25)			#筛选出矩阵中小于25的元素
[ True  True False False]

a,b矩阵相乘:np.dot(a,b)或者a.dot(b)

In[19]: a=np.array([[1,1],[0,1]])
In[20]: b=np.arange(4).reshape((2,2))
In[21]: print(a,b,sep='\n')
[[1 1]
 [0 1]]
[[0 1]
 [2 3]]
In[22]: print(np.dot(a,b))
[[2 4]
 [2 3]]
In[23]: print(a.dot(b))
[[2 4]
 [2 3]]

np.random.random():生成0到1的随机数
np.sum(…):求和,想对某一行或者某一列求和加上axis=1或axis=0
np.min(…):求最小值,同上
np.max(…):求最大值,同上

In[26]: print(np.random.random((2,4)))
[[0.36933939 0.78979226 0.07014476 0.63035032]
 [0.9447366  0.58810221 0.31002611 0.2570716 ]]
In[27]: a=np.array([[1,1,3,4],[2,5,7,8]])
In[28]: print(np.sum(a))
31
In[29]: print(np.sum(a,axis=0))
[ 3  6 10 12]
In[30]: print(np.sum(a,axis=1))
[ 9 22]
In[31]: print(np.max(a))
8
In[32]: print(np.max(a,axis=0))
[2 5 7 8]
In[33]: print(np.max(a,axis=1))
[4 8]

np.argmin(…):矩阵中最小值的下标
np.argmax(…)是最大值的下标
np.mean(…)是求矩阵中的平均值,等同于 矩阵.mean()
np.median(…)是求矩阵的中位数

In[35]: a=np.arange(1,13).reshape((3,4))
In[36]: print(a)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
In[37]: print(np.argmax(a))
11
In[38]: print(np.mean(a))
6.5
In[39]: print(np.median(a))
6.5

np.cumsum(…):返回一个矩阵,返回的矩阵第一个数是该函数参数的矩阵中的第一个数,第二个数是参数矩阵的前两个数字的和,第三个数是参数矩阵前三给数字的和…以此类推
np.diff(…):返回矩阵中每两个相邻元素的差组成的矩阵
np.nonzero(…):返回两个矩阵,第一个是非零元素的行,第二个是非零元素的列,两个矩阵的对应同一个位置组合起来就是每一个非零元素的位置
np.sort(…):对矩阵进行排序

#接上面的,a还是和上一个程序片段相等
In[40]: print(np.cumsum(a))
[ 1  3  6 10 15 21 28 36 45 55 66 78]
In[41]: print(np.diff(a))
[[1 1 1]
 [1 1 1]
 [1 1 1]]
In[42]: print(np.nonzero(a))
(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
In[45]: a=np.array([[4,3,2,1],[8,7,6,5],[12,11,10,9]])
In[46]: print(np.sort(a))
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

np.transpose(a):返回矩阵a的转置矩阵,等同于a.T
np.clip(a,a_min,a_max):把矩阵a中小于a_min的让其等于a_min,大于a_max的让他等于a_max,得到一个新的矩阵

In[48]: a=np.sort(a)
In[49]: print(a)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
In[50]: np.transpose(a)
Out[50]: 
array([[ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11],
       [ 4,  8, 12]])
In[51]: np.clip(a,6,12)
Out[51]: 
array([[ 6,  6,  6,  6],
       [ 6,  6,  7,  8],
       [ 9, 10, 11, 12]])

注意:很多函数,都可以在参数中加上axis=0或1这样的参数,对所有行或列而不是所有元素进行相应操作,不再一 一列举

numpy的索引

numpy在很多方面和python语法中的列表用法相同,如:

In[55]: a=np.arange(10)
In[56]: print(a[2])
2
In[57]: a=np.arange(12).reshape((3,4))
In[58]: print(a)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
In[59]: print(a[1])
[4 5 6 7]
In[60]: print(a[1][1])
5
In[61]: print(a[1,1:3])  #打印第1行的1到2个元素
[5 6]
In[62]: print(a[1,:])  #打印第1行所有
[4 5 6 7]

遍历:
如果是二维的,遍历一次得到一行,如果想对列进行遍历,一次想得到一列,那么可以对A进行转置即A.T,如果想得到每个元素,则需要调用for … in a.flat:…
a.flat:一个可迭代对象,迭代下来可以得到每一个元素
a.flatten():对上面的a.flat迭代得到的结果组成的矩阵

#接上面
In[63]: for i in a:
   ...:     print(i)
   ...:     
[0 1 2 3]
[4 5 6 7]
[ 8  9 10 11]
In[64]: for i in a.T:
   ...:     print(i)
   ...:     
[0 4 8]
[1 5 9]
[ 2  6 10]
[ 3  7 11]
In[65]: for i in a.flat:
   ...:     print(i)
   ...:     
0
1
2
3
4
5
6
7
8
9
10
11
In[66]: print(a.flatten())
[ 0  1  2  3  4  5  6  7  8  9 10 11]

numpy的array合并

np.vstack():纵向合并
np.hstack():横向合并

In[2]: import numpy as np
In[3]: a=np.array([1,1,1])
In[4]: b=np.array([2,2,2])
In[6]: print(np.vstack((a,b)))
[[1 1 1]
 [2 2 2]]
In[7]: print(np.hstack((a,b)))
[1 1 1 2 2 2]

矩阵a[,newaxis:]:在行上增加一个维度
矩阵a[:,newaxis]:在列上增加一个维度

In[15]: print(a[:,np.newaxis])
[[1]
 [1]
 [1]]
 In[17]: print(a[np.newaxis,:])
[[1 1 1]]

np.concatenate():更简单直接的合并方式,可以指定按行或者按列

In[22]: a=a[np.newaxis,:]
In[23]: b=b[np.newaxis,:]
In[24]: print(a,b,sep='\n')
[[1 1 1]]
[[2 2 2]]
In[25]: np.concatenate((a,a,b,b),axis=1)
Out[25]: array([[1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]])
In[26]: np.concatenate((a,a,b,b),axis=0)
Out[26]: 
array([[1, 1, 1],
       [1, 1, 1],
       [2, 2, 2],
       [2, 2, 2]])
In[27]: np.concatenate((a,a,b,b))
Out[27]: 
array([[1, 1, 1],
       [1, 1, 1],
       [2, 2, 2],
       [2, 2, 2]])

numpy的分割

np.split():将矩阵分割成相等的几部分,可以指定按行还是按列分割
np.array_split():和前者差不多,只不过它可以进行不等量的分割,前者只能进行等量分割

In[29]: a=np.arange(16).reshape((4,4))
In[30]: print(a)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
In[31]: print(np.split(a,2))
[array([[0, 1, 2, 3],
       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])]
In[34]: print(np.split(a,2,axis=0))
[array([[0, 1, 2, 3],
       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])]
In[35]: print(np.split(a,2,axis=1))
[array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])]
In[36]: print(np.array_split(a,3))     #将矩阵进行不等量分割
[array([[0, 1, 2, 3],
       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11]]), array([[12, 13, 14, 15]])]

numpy的copy和deep copy

这和python中的类似

In[37]: a=np.array([1,2,3,4])
In[38]: b=a
In[39]: a[0]=11
In[40]: b
Out[40]: array([11,  2,  3,  4])
In[41]: b=a.copy()
In[42]: a[1]=12
In[43]: a
Out[43]: array([11, 12,  3,  4])
In[44]: b
Out[44]: array([11,  2,  3,  4])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值