pandas_task01-预备知识.md

第一章 预备知识

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=’<U1’比较新奇,之前没看过。查了下是大小端,类型是uint8

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='<U1')

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

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()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值