1.6 比较、掩码和布尔逻辑

第一章 numpy入门

1.6 比较、掩码和布尔逻辑


1.6.1 台湾年降水量

rainfall_t = pd.read_csv('rain_tw_2018.csv')
print(rainfall_t.columns)
rainfall = rainfall_t.loc[:,['Time','Rainfall']]
print("获取time和rainfall列:\n",rainfall.head())
rainfall['Time'] = rainfall['Time'].str.split(' ').str.get(0)
print("time列切割后:\n",rainfall.head())
rainfall = rainfall.groupby('Time').sum()['Rainfall']   # 得到每天的降水量
print(rainfall.shape) # 2018-5 到 2019-1月
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn; seaborn.set()
plt.hist(rainfall,40)
Index(['Latitude', 'Longitude', 'Column3', 'StationID', 'Time', 'Height',
       'WindDirection', 'WindSpeed', 'Temperature', 'Humidity', 'Pressure',
       'Rainfall', 'MaxWindSpeed', 'MaxWindDirection', 'MaxWindTime',
       'AvMaxWindSpeed', 'AvMaxWindDirection', 'TimeAxMaxWindDirection',
       'NoIdea', 'City', 'CityID', 'District', 'DistrictID'],
      dtype='object')
获取time和rainfall列:
             Time  Rainfall
0  2018/5/1 0:00         0
1  2018/5/1 0:10         0
2  2018/5/1 0:20         0
3  2018/5/1 0:30         0
4  2018/5/1 0:40         0
time列切割后:
        Time  Rainfall
0  2018/5/1         0
1  2018/5/1         0
2  2018/5/1         0
3  2018/5/1         0
4  2018/5/1         0
(257,)

1.6.2 比较操作

通用函数章节介绍了+、-、*、/和其他运算符驶向了数组的逐个元素操作。NumPy还实现了如<和>的逐个元素比较哦的通用函数。

这些比较运算符的结果是一个布尔数据类型的数组。一共有6种标准的比较操作:

1.一维数组比较

import numpy as np
import pandas as pd

x = np.array([1,2,3,4,5])
print("x < 3 :\n",x < 3)      # 等价于 np.less
print("x > 3 :\n",x > 3)      # 等价于 np.greater
print("x <= 3 :\n",x <= 3)    # 等价于 np.less_equal
print("x >= 3 :\n",x >= 3)    # 等价于 np.greater_equal
print("x == 3 :\n",x == 3)    # 等价于 np.equal
print("x != 3 :\n",x != 3)    # 等价于 np.not_equal
# 复合表达式比较:
print("(2 * x) == (x ** 2) :\n",(2 * x) == (x ** 2))
# 和算数运算符一样,比较运算操作在NumPy中也是借助通用函数来实现的。
# 例如当你写x < 3时,NumPy内部会使用np.less(x,3)。
x < 3 :
 [ True  True False False False]
x > 3 :
 [False False False  True  True]
x <= 3 :
 [ True  True  True False False]
x >= 3 :
 [False False  True  True  True]
x == 3 :
 [False False  True False False]
x != 3 :
 [ True  True False  True  True]
(2 * x) == (x ** 2) :
 [False  True False False False]

2.二维数组比较

rng = np.random.RandomState(0)
x_2D = rng.randint(10,size=(3,4))
print("x_2D:\n",x_2D)
print("x_2D < 6:\n",x_2D < 6)
x_2D:
 [[5 0 3 3]
 [7 9 3 5]
 [2 4 7 6]]
x_2D < 6:
 [[ True  True  True  True]
 [False False  True  True]
 [ True  True False False]]

1.6.3 布尔操作

1.布尔统计

print("原数组x_2D:\n",x_2D)
print("统计所有:",np.sum(x_2D < 6))
print("沿着行统计:",np.sum(x_2D < 6,axis=1))
print("是否有值满足条件:",np.any(x_2D < 6))
print("是否有值满足条件:",np.any(x_2D == 6))
print("是否所有值满足条件:",np.all(x_2D < 10))
print("是否所有值满足条件:",np.all(x_2D == 6))
print("是否每行所有值满足条件:",np.all(x_2D < 6,axis=1))
原数组x_2D:
 [[5 0 3 3]
 [7 9 3 5]
 [2 4 7 6]]
统计所有: 8
沿着行统计: [4 2 2]
是否有值满足条件: True
是否有值满足条件: True
是否所有值满足条件: True
是否所有值满足条件: False
是否每行所有值满足条件: [ True False False]

2.布尔运算符

# 逐位逻辑运算符&、|、~
print("降水量在1000到3000毫升的天数为:",np.sum((rainfall > 1000) & (rainfall < 3000)),"天")  
print("没有下雨的天数:",np.sum(rainfall == 0))
print("下雨的天数:",np.sum(rainfall != 0))
print("降雨量大于2000毫升的天数:",np.sum(rainfall > 2000))
print("降雨量在0到3000毫升的天数:",np.sum((rainfall > 0) & (rainfall < 3000)))
# 通用函数对应的运算符:
# &      np.bitwise_and
# |      np.bitwise_or
# ^      np.bitwise_xor
# ~      np.bitwise_not
降水量在1000到3000毫升的天数为: 14 天
没有下雨的天数: 99
下雨的天数: 158
降雨量大于2000毫升的天数: 86
降雨量在0到3000毫升的天数: 65

1.6.4 掩码操作

# 前面简绍了如何直接对布尔数组进行聚合计算。一种更强大的模式是使用布尔数组作为掩码,
# 通过该掩码选择数据的子数据集。
x = np.array([[5,0,3,3],[7,9,3,5],[2,4,7,6]])
print("x:\n",x)
# 取出数组中小于5的元素:
print("x < 5:\n",x < 5)
# 为了将这些值从数组中取出,可以进行简单的索引,即掩码操作:
print("x[x < 5]:\n",x[x < 5])

# 为所有下雨天创建一个掩码
rainy = (rainfall > 0)
# 构建一个包含整个夏季日期的掩码(6月21日是第172天)
summer = (np.arange(257) - 172 + 365 - 257 < 90) & (np.arange(257) - 172 + 365 - 257 > 0)
print("下雨天的雨量中位数:",np.median(rainfall[rainy]))
print("夏天的雨量中位数:",np.median(rainfall[summer]))
print("夏天的雨量最大值:",np.max(rainfall[summer]))
print("非夏日的下雨天雨量中位数:",np.median(rainfall[rainy & ~summer]))
x:
 [[5 0 3 3]
 [7 9 3 5]
 [2 4 7 6]]
x < 5:
 [[False  True  True  True]
 [False False  True False]
 [ True  True False False]]
x[x < 5]:
 [0 3 3 3 2 4]
下雨天的雨量中位数: 4692.0
夏天的雨量中位数: 0.0
夏天的雨量最大值: 280225
非夏日的下雨天雨量中位数: 6486.5

posted on 2020-02-16 20:02  -小鱼-  阅读(356)  评论(0编辑  收藏  举报

导航