第一章 预备知识

2020-12-14  本文已影响0人  陈易男

本节主要学习一些使用pandas所需要的python基础和numpy基础

一、Python基础

\color{orange}{1、列表推导式与条件赋值}

In : [m+'_'+n for m in ['a', 'b'] for n in ['c', 'd']]
Out: ['a_c', 'a_d', 'b_c', 'b_d']

两个for依次为外循环和内循环

x = True
y = 1 if x==True else 0

等价于C语言中

bool x = true
y = x==true ? 1 : 0
In : L = [1, 2, 3, 4, 5, 6, 7]
In : [i if i <= 5 else 5 for i in L]
Out: [1, 2, 3, 4, 5, 5, 5]

\color{orange}{2、匿名函数与map方法}

import math
func = lambda x: math.sin(x)+math.exp(x)
In : list(map(lambda x: 2*x, range(5)))
Out: [0, 2, 4, 6, 8]

\color{orange}{3、zip对象与enumerate方法}

In : L1, L2, L3 = list('abc'), list('def'), list('hij')
In : list(zip(L1, L2, L3))
Out: [('a', 'd', 'h'), ('b', 'e', 'i'), ('c', 'f', 'j')]

可以使用*将zip的对象解压

In : zipped = list(zip(L1, L2, L3))
In : list(zip(*zipped)) # 三个元组分别对应原来的列表
Out: [('a', 'b', 'c'), ('d', 'e', 'f'), ('h', 'i', 'j')]

二、Numpy基础

\color{orange}{1、numpy数组的构造}

通常使用np.array来构造np数组

In: import numpy as np
In: np.array([1,2,3])
Out: array([1,2,3])

np.linsapce,np.arange用于生成等差序列
np.zeros,np.eye,np.full用于生成特殊矩阵
np.random用于生成随机矩阵

\color{orange}{2、numpy数组的变形与合并}

\color{orange}{3、numpy数组的切片与索引}

可以使用slice类型切片,还可以使用bool类型索引

\color{orange}{4、常用函数}

\color{orange}{5、广播机制}

用于处理两个不同维度数组之间的操作

\color{orange}{5、向量与矩阵的计算}

三、练习

\color{Blue}{1、利用列表推导式写矩阵乘法}

Ex1
我的解答
M1 = np.random.rand(2,3)
M2 = np.random.rand(3,4)
res = np.empty((M1.shape[0],M2.shape[1]))
res = [[sum([M1[i][k]*M2[k][j] for k in range(M1.shape[1])]) for j in range(M2.shape[1])] for i in range(M1.shape[0])]
((M1@M2 - res) < 1e-15).all() # 排除数值误差
Ex1 result

\color{Blue}{2、更新矩阵}

Ex2
我的解答
def update_func(A:np.array)->np.array:
    _A = np.sum(1 / A, axis=1).reshape(-1,1)
    B = A * _A
    return B
A = np.array([[1,2,3],
             [4,5,6],
             [7,8,9]])
B = update_func(A)
print(B)
Ex2 result

\color{Blue}{3、卡方统计量}

Ex3
我的解答
np.random.seed(0)
A = np.random.randint(10, 20, (8, 5))
def calc_chi_square(A:np.array)->np.array:
    B = np.sum(A,axis=1).reshape(-1,1)*np.sum(A,axis=0).reshape(1,-1) / np.sum(A)
    return np.sum(np.power(A-B,2)/B)
calc_chi_square(A)
Ex3 result

\color{Blue}{4、改进矩阵计算的性能}

Ex4
我的解答
本题主要是矩阵的转换,结果参考了参考答案
参考答案
def my_solution(B, U, Z):
     return (((B**2).sum(1).reshape(-1,1) + (U**2).sum(0) - 2*B@U)*Z).sum()
my_solution(B,U,Z)
性能改进程度

\color{Blue}{5、连续整数的最大长度}

Ex5
我的解答
def find_max(x: np.array)->np.array:
    diff_x = np.r_[1,np.diff(x)!=1,1]
    return np.diff(np.nonzero(diff_x)).max()
x = [3,2,1,2,3,4,6]
find_max(x)
Ex5 result
上一篇下一篇

猜你喜欢

热点阅读