第一章 预备知识

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

一、Python基础

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

  • 列表推导式
    可以使用简介的形式生成列表内容,其形式一般为[func(x) for x in set],同时,列表表达式还支持多层嵌套,一个简单的例子如下
In : [m+'_'+n for m in ['a', 'b'] for n in ['c', 'd']]
Out: ['a_c', 'a_d', 'b_c', 'b_d']

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

  • 条件赋值
    类似于C语言的条件赋值运算符
x = True
y = 1 if x==True else 0

等价于C语言中

bool x = true
y = x==true ? 1 : 0
  • 列表推导式与条件赋值的综合运用
    截断一个列表中超过5的元素,使用5替代超过5的元素
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方法}

  • 匿名函数可以表示一些简单的映射关系
    如使用匿名函数编写一个函数表示映射关系f(x)=sin(x)+e^x
import math
func = lambda x: math.sin(x)+math.exp(x)
  • map方法
    map可以实现对一个对象实施一种映射操作并返回一个map对象,可以通过list转换
In : list(map(lambda x: 2*x, range(5)))
Out: [0, 2, 4, 6, 8]

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

  • zip对象
    将多个可迭代对象打包成一个元组构成的可迭代对象,返回一个zip对象
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')]
  • enumerate
    是一种特殊的打包,它可以在迭代时绑定迭代元素的遍历序号

二、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数组的变形与合并}

  • 变形操作
    转置 .T
    合并 np.r_, np.c_,用于行合并和列合并
  • 变形
    reshape

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

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

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

  • where:一种条件函数,可以指定满足条件与不满足条件位置对应的填充值
  • nonzero, argmax, argmin:这三个函数返回的都是索引, nonzero 返回非零数的索引, argmax, argmin 分别返回最大和最小数的索引
  • any,all:any 指当序列至少 存在一个 True 或非零元素时返回 True ,否则返回 False; all 指当序列元素 全为 True 或非零元素时返回 True ,否则返回 False
  • cumprod, cymsum, diff: cumprod , cumsum分别表示累乘和累加函数,返回同长度的数组, diff 表示和前一个元素做差,由于第一个元素为缺失值,因此在默认参数情况下,返回长度是原数组减1
  • 统计函数:常用的统计函数包括 max, min, mean, median, std, var, sum, quantile ,其中分位数计算是全局方法,因此不能通过 array.quantile 的方法调用。协方差计算函数为cov,相关系数计算函数为corrcoef

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

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

  • 标量和数组之间的操作
    标量会自动把大小扩充为数组大小,然后逐个元素操作
  • 二维数组之间的操作
    当两个数组维度完全一致时,使用对应元素的操作,否则会报错,除非其中的某个数组的维度是 m×1 或者 1×n ,那么会扩充其具有 1 的维度为另一个数组对应维度的大小。
  • 一维数组与二位数组之间的操作
    当一维数组 A_k 与二维数组 B_{m,n} 操作时,等价于把一维数组视作A_{1,k} 的二维数组,使用的广播法则与二维数组之间的操作一致,当 k!=nk,n都不是 1 时报错。

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

  • 内积 dot
  • 向量范数和矩阵范数 np.linalg.normord参数的可选值如下图
    ord参数的可选值
  • 矩阵乘法 @

三、练习

\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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、数据结构概述 1.什么是数据结构? 我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存...
    卖报的女孩阅读 2,790评论 0 0
  • 神经网络预备知识 目标:学会神经网络优化过程,使用正则化减少过拟合,使用优化器更新网络参数 预备知识 神经网络复杂...
    原上的小木屋阅读 3,101评论 0 0
  • 数据结构 1. 概述 数据结构定义: 我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储...
    xiaoyouPrince阅读 5,167评论 0 1
  • 数据结构预备知识 在进行数据结构讲解时,我们需要把一些基础知识进行复习和巩固,目的是为了方便数据结构的学习,主要涉...
    长风留言阅读 5,481评论 1 9
  • 今天是Pandas学习的第一天,学习的是预备知识,主要分为Python基础和NumPy基础。 Python基础 这...
    君恒_801f阅读 3,251评论 0 1

友情链接更多精彩内容