列表表达式
#第个*是映射函数,第二个*是指代的对象
[* for i in *]
列表表达式还支持多层嵌套
[m+'_'+n for m in ['a', 'b'] for n in ['c', 'd']]
个人理解:虽然简单了,字数变少了,但是是可读性降低了,对程序员没那么友好。简单的一步操作可以,多层嵌套或者复杂逻辑不太建议过多使用该方式。
条件赋值
value = a if condition else b :
往往在无需多处调用的场合进行使用
my_func = lambda x: 2*x
zip函数能够把多个可迭代对象打包成一个元组构成的可迭代对象,它返回了一个 zip 对象,通过 tuple, list 可以得到相应的打包结果
个人理解:zip的作用是多个变量可以每次同时移动,结对向前/后走
enumerate 是一种特殊的打包,它可以在迭代时绑定迭代元素的遍历序号
多了个编号
比较基础,等差数列的构造第一次知道有单独的方法
np.linspace(1,5,11) # 起始、终止(包含)、样本个数
choice 可以从给定的列表中,以一定概率和方式抽取结果,当不指定概率时为均匀采样,默认抽取方式为有放回抽样 np合并操作: r_, c_ 布尔索引,这个之前没看见过 cumprod, cumsum, diff 不同维度之间数组的操作 矩阵乘法: @ 三重循环改写成列表表达式 思考:仔细看这个公式就是A矩阵原本元素值*(该行所在所有元素值倒数的和) 先整出B来 没有什么思路,看了答案知道可以分解,第一第二项分别为 B 的行平方和与 U的列平方和,第三项是两倍的内积。 自己想的比较复杂
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='
2. np数组的变形与合并
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 表示和前一个元素做差,由于第一个元素为缺失值,因此在默认参数情况下,返回长度是原数组减1In [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:更新矩阵
倒数1/A
求和 第二个维度上相加 X.sum(1)A = np.arange(1,10).reshape(3,-1)
B = A*(1/A).sum(1).reshape(-1,1)
Ex3:卡方统计量
B=A.sum(0)*A.sum(1).reshape(-1,1)/A.sum()
B
res5 = ((A-B)**2/B).sum()
print(res5)
Ex4:改进矩阵计算性能
(((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()