- 积分
- 5344
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2012-8-28
- 最后登录
- 1970-1-1
|
发表于 2020-7-11 09:34:48
|
显示全部楼层
首先简述一下Python中布尔(bool)逻辑数的计算规则,他是可以进行加运算和乘运算的,分别对应或运算以及且运算的,比如:
False+False=False False+True=True True+True=True
False*False=False False*True=False True*True=True
这是因为Python中False是0,而非零数视为True,所以可以进行以上运算的。
下面开始讲实际问题,其实楼主的想法就是把两个序列中互不为nan的的地方挑出来,然后做皮尔森相关。
那首先是判断一个numpy数组中的每个元素是否是nan,这个用nump.isnan函数,比如:
- import numpy as np
- a=np.array([1,2,np.nan,4,np.nan,6,7,8,9,0])
- b=np.array([1,np.nan,3,4,np.nan,6,7,8,np.nan,0])
- print(np.isnan(a))
- print(np.isnan(b))
复制代码
输出的结果为:
- [False False True False True False False False False False]
- [False True False False True False False False True False]
复制代码
可以看到为nan的地方为True,在存在有效值的位置书False,这时候可以使用非运算符(not或者~),取反事件:
- print(~np.isnan(a))
- print(~np.isnan(b))
复制代码
结果:
- [ True True False True False True True True True True]
- [ True False True True False True True True False True]
复制代码
利用最开始说的计算规则,将两个布尔数组做且运算,也就是乘运算。
- notnan=~np.isnan(a) * ~np.isnan(b)
复制代码
结果:
- [ True False False True False True True True False True]
复制代码
这时候这个notnan中的True的位置,都是a和b数组中均不为nan的地方。
最后使用这个notnan的布尔数组分别对a和b数组进行broadcast取数:
- print(a[notnan])
- print(b[notnan])
复制代码
结果:
- [1. 4. 6. 7. 8. 0.]
- [1. 4. 6. 7. 8. 0.]
复制代码
另外numpy有一个zeros_like函数,你这个r和p零矩阵生成的时候,直接可以这样:
- r,p = np.zeros_like(y),np.zeros_like(y)
复制代码
就不用再去用shape折腾出原来矩阵的大小,然后再来生成了.... |
评分
-
查看全部评分
|