pandas_task01-预备知识.md

文章目录

  • 第一章 预备知识
    • python基础
      • 1. 列表推导式与条件赋值
      • 2.匿名函数和Map
      • 3. zip对象与enumerate方法
    • Numpy基础
      • 1.Numpy数组的构造
      • 2. np数组的变形与合并
      • 3. np数组的切片与索引
      • 4. 常用函数
      • 5. 广播机制
      • 6. 向量与矩阵的计算
    • 练习
      • Ex1:利用列表推导式写矩阵乘法
      • Ex2:更新矩阵
      • Ex3:卡方统计量
      • Ex4:改进矩阵计算性能
      • Ex5:连续整数的最大长度

第一章 预备知识

python基础

1. 列表推导式与条件赋值

列表表达式

#第个*是映射函数,第二个*是指代的对象 
 [* for i in *]

列表表达式还支持多层嵌套

 [m+'_'+n for m in ['a', 'b'] for n in ['c', 'd']]

个人理解:虽然简单了,字数变少了,但是是可读性降低了,对程序员没那么友好。简单的一步操作可以,多层嵌套或者复杂逻辑不太建议过多使用该方式。
条件赋值
value = a if condition else b :

2.匿名函数和Map

往往在无需多处调用的场合进行使用

my_func = lambda x: 2*x

3. zip对象与enumerate方法

zip函数能够把多个可迭代对象打包成一个元组构成的可迭代对象,它返回了一个 zip 对象,通过 tuple, list 可以得到相应的打包结果
个人理解:zip的作用是多个变量可以每次同时移动,结对向前/后走
enumerate 是一种特殊的打包,它可以在迭代时绑定迭代元素的遍历序号
多了个编号

Numpy基础

1.Numpy数组的构造

比较基础,等差数列的构造第一次知道有单独的方法

np.linspace(1,5,11) # 起始、终止(包含)、样本个数

choice 可以从给定的列表中,以一定概率和方式抽取结果,当不指定概率时为均匀采样,默认抽取方式为有放回抽样
dtype=’

In [48]: my_list = ['a', 'b', 'c', 'd']

In [49]: np.random.choice(my_list, 2, replace=False, p=[0.1, 0.7, 0.1 ,0.1])
Out[49]: array(['b', 'd'], dtype=')

In [50]: np.random.choice(my_list, (3,3))
Out[50]: 
array([['a', 'c', 'd'],
       ['d', 'b', 'c'],
       ['d', 'c', 'a']], dtype=')

2. np数组的变形与合并

np合并操作: r_, c_
pandas是concat,这个用的多一点,pd和np可以相互转换

3. np数组的切片与索引

布尔索引,这个之前没看见过
可以利用 np.ix_ 在对应的维度上使用布尔索引,但此时不能使用 slice 切片:


In [74]: target[np.ix_([True, False, True], [True, False, True])]
Out[74]: 
array([[0, 2],
       [6, 8]])

In [75]: target[np.ix_([1,2], [True, False, True])]
Out[75]: 
array([[3, 5],
       [6, 8]])

4. 常用函数

cumprod, cumsum, diff
cumprod, cumsum 分别表示累乘和累加函数,返回同长度的数组, diff 表示和前一个元素做差,由于第一个元素为缺失值,因此在默认参数情况下,返回长度是原数组减1

In [87]: a = np.array([1,2,3])

In [88]: a.cumprod()
Out[88]: array([1, 2, 6], dtype=int32)

In [89]: a.cumsum()
Out[89]: array([1, 3, 6], dtype=int32)

In [90]: np.diff(a)
Out[90]: array([1, 1])

5. 广播机制

不同维度之间数组的操作

6. 向量与矩阵的计算

矩阵乘法: @

练习

Ex1:利用列表推导式写矩阵乘法

三重循环改写成列表表达式
我打印了下res的数据发现不是全0的数据,查了下资料是因为np.numpy数据类型默认为 numpy.float64,索引当我们没有指定任何数据类型时,返回i的数据肯定是 numpy.float64,即这时不可能为空.加上dtype=list后输出,真正为空,每个元素值为None.

# 一开始我是这样想的 列表表达式不是从前往后 前面的是外层循环吗 于是写成了这样 但是输出结果不对
>>>res3 = [[sum([M1[i][k] * M2[k][j] for i in range(M1.shape[0]) for j in range(M2.shape[1]) for k in range(M1.shape[1])]) ] ]
>>>print(res3)
[[5.0608402017571095]]
# 然后我想到了这是个2*4的数组 直接这样肯定就一个值啊 得把形状考虑进去 因为括号的原因所以按照从括号外到括号里的运算规则 这样就对了
>>>res2 = [[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])]
>>>print(res2)
[[0.4497728836179936, 0.16391458090280941, 0.8606304488867611, 1.3204900728080542], [0.7150619729579077, 0.3172501483435466, 0.43325647433067443, 0.8004636199093613]]

Ex2:更新矩阵

思考:仔细看这个公式就是A矩阵原本元素值*(该行所在所有元素值倒数的和)
倒数1/A
求和 第二个维度上相加 X.sum(1)

A = np.arange(1,10).reshape(3,-1)
B = A*(1/A).sum(1).reshape(-1,1)

Ex3:卡方统计量

先整出B来

B=A.sum(0)*A.sum(1).reshape(-1,1)/A.sum()
B
res5 = ((A-B)**2/B).sum()
print(res5)

Ex4:改进矩阵计算性能

没有什么思路,看了答案知道可以分解,第一第二项分别为 B 的行平方和与 U的列平方和,第三项是两倍的内积。

(((B**2).sum(1).reshape(-1,1) + (U**2).sum(0) - 2*B@U)*Z).sum()

Ex5:连续整数的最大长度

自己想的比较复杂

f = lambda x:np.diff(np.nonzero(np.r_[1,np.diff(x)!=1,1])).max()

你可能感兴趣的:(pandas,pandas,python,深度学习)