Numpy和pandas
-
Numpy初体验
1,Numpy创建数组
Numpy 的arange方法创建多维数组。创建多维数组的方法是:
import numpy as np
b = np.array([np.arange(6),np.arange(6)])
numpy创建的数组可以直接复制,具体代码示例如下:
import numpy as np
x = [y for y in range(6)]
b=np.array([x]*4)
import numpy as np
# 定义cnmda函数
def cnmda(m,n):
'''
创建numpy数组
参数:
m:第一维的长度
n: 第二维的长度
返回值:
ret: 一个numpy数组
'''
ret = 0
# 请在此添加创建多维数组的代码并赋值给ret
#********** Begin *********#
b=np.arange(n);
ret=np.array([b]*m)
#********** End **********#
return ret
b=np.arange(n);
ret=np.array([b]*m)
2,Numpy数组的基本运算
Numpy库可以直接进行一些四则运算,快速的处理两个Numpy数组:
向量与向量之间:
1.加法
- In:np.add(a,b) 或 a+b
- Out:array([[5, 7, 9],
- [5, 7, 9]])
2.减法
- In:np.subtract(a,b) 或 a-b
- Out:array([[-3, -3, -3],
- [ 3, 3, 3]])
3.乘法(X乘)
- In:np.multiply(a,b) 或 a * b
- Out:array([[ 4, 10, 18],
- [ 4, 10, 18]])
4.乘法(点乘)
- a = np.array([[1,2,3],[4,5,6]])
- b = np.array([4,5,6])
- In: np.dot(a,b)
- Out:array([32, 77])
5.除法
- a = np.array([[1,2,3],[4,5,6]])
- b = np.array([[4,5,6],[1,2,3]])
- In:np.divide(a,b) 或 a/b
- Out:array([[ 0.25, 0.4 , 0.5 ],
- [ 4. , 2.5 , 2. ]])
向量与标量之间
a = np.array([[1,2,3],[4,5,6]])
1.加法
- In: a +1
- Out:array([[2, 3, 4],
- [5, 6, 7]])
2.减法
- In: a -1
- Out:array([[0, 1, 2],
- [3, 4, 5]])
3.乘法
- In: a*2
- Out:array([[ 2, 4, 6],
- [ 8, 10, 12]])
4.除法
- In: a/2
- Out:array([[ 0.5, 1. , 1.5],
- [ 2. , 2.5, 3. ]])
5.求余
- In:a%2
- Out:array([[1, 0, 1],
- [0, 1, 0]])
6.矩阵转置
- In:a.T
- Out:array([[1, 4],
- [2, 5],
- [3, 6]])
7.矩阵的逆
矩阵可逆的充要条件是矩阵满秩。
- import numpy as np
- import numpy.linalg as lg
- a = np.array([[1,2,3],[4,5,6],[7,8,9]])
- In:lg.inv(a)
- Out:array([[ 3.15251974e+15, -6.30503948e+15, 3.15251974e+15],
- [ -6.30503948e+15, 1.26100790e+16, -6.30503948e+15],
- [ 3.15251974e+15, -6.30503948e+15, 3.15251974e+15]])
import numpy as np
# 定义opeadd函数
def opeadd(m,b,n):
'''
参数:
m:是一个数组
b:是一个列表
n:是列表中的索引
你需要做的是 m+b[n]
返回值:
ret: 一个numpy数组
'''
ret = 0
#********** Begin *********#
ret=m+b[n]
#********** End **********#
return ret
# 定义opemul函数
def opemul(m,b,n):
'''
参数:
m:是一个数组
b:是一个列表
n:是列表中的索引
你需要做的是 m*b[n]
返回值:
ret: 一个numpy数组
'''
ret = 0
#********** Begin *********#
ret=m*b[n]
#********** End **********#
return ret
3,第3关:Numpy数组的切片与索引
一维Numpy数组的切片操作与Python列表的切片一样。下面首先来定义数字0 1 2直到8的数组,然后通过指定下标3到7来选择数组的部分元素,这实际上就是提取数组中值为3到6的元素。
- In: import numpy as np
- In: a = np.arange(9)
- In: a[3:7]
- Out: array([3,4,5,6])
同时用下标选择元素,下标范围从0到7,并且下标每次递增2,如下所示:
- In: a[:7:2]
- Out:array([0,2,4,6])
也可以像Python数组一样,用负值下标来反转数组:
- In: a[::-1]
- Out: array([8,7,6,5,4,3,2,1,0])
对于二维数组的索引,类似与Python数组的列表:
- In: a=np.array([[1,2,3],[4,3,2]])
- In: a[1][0]
- Out:array([4])
- In:a[1,:2] #获取第1维的前2个元素
- Out:array([4, 3])
import numpy as np
# 定义cnmda函数
def ce(a,m,n):
'''
参数:
a:是一个Numpy数组
m:是第m维数组的索引
n:第m维数组的前n个元素的索引
返回值:
ret: 一个numpy数组
'''
ret = 0
# 请在此添加切片的代码,实现找出多维数组a中第m个数组的前n个元素 并赋值给ret
#********** Begin *********#
ret=a[m,:n]
#********** End **********#
return ret
ret= a[m,:n]
4,第4关:Numpy数组的堆叠
改变数组形状reshape(),ravel(),flatten(),shape(),transpose()
数组的堆叠hstack(),vstack(),dstack()
改变数组形状
reshape()
- import numpy as np
- In: b = np.arange(24).reshape(2,3,4)
- In: b
- Out: array([[[ 0, 1, 2, 3],
- [ 4, 5, 6, 7],
- [ 8, 9, 10, 11]],
- [[12, 13, 14, 15],
- [16, 17, 18, 19],
- [20, 21, 22, 23]]])
ravel()
拆解,将多维数组变成一维数组。
- In: b.ravel()
- Out: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
- 17, 18, 19, 20, 21, 22, 23])
flatten()
拉直,其功能与ravel()相同,但是flatten()返回的是真实的数组,需要分配新的内存空间,而ravel()仅仅是改变视图。
- In: b.flatten()
- Out: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
- 17, 18, 19, 20, 21, 22, 23])
shape()
使用元组改变数组形状。
- In: b.shape = (6,4)
- In: b
- out: array([[ 0, 1, 2, 3],
- [ 4, 5, 6, 7],
- [ 8, 9, 10, 11],
- [12, 13, 14, 15],
- [16, 17, 18, 19],
- [20, 21, 22, 23]])
transpose()
转置。
- In: b.transpose()
- Out: array([[ 0, 4, 8, 12, 16, 20],
- [ 1, 5, 9