笔记,代码来自和鲸社区
一、比较、掩码与布尔逻辑
1.比较
进行逐元素比较操作时,可以使用通用函数及复合表达式两种方式,运算的结果是一个布尔类型的数组(得到对应位置的结果,True or False)。其中对于通用函数,可以使用函数形式如np.greater(x,3),也可以直接使用运算表达式x>3。
import numpy as np
rad = np.random.RandomState(0) #随机数种子,但不是全局
x = rad.randint(10, size = (3, 4))
print(x < 6) #通用函数
print((2 * x) == (x ** 2)) #复合表达式
2.布尔数组与掩码
True为1,False为0。
统计个数。使用np.count_nonzero(x>3),np.sum(x>3,axis=0)计算True的个数。np.any()实现的是有没有值符合条件,np.all()实现的是所有值是否符合条件。使用方法均相同,表达式+指定行/列。
import numpy as np
print('x < 6 的个数:', np.count_nonzero(x < 6))
print('每行 x < 6的个数:', np.sum(x < 6, axis = 1))
print('有没有值小于0:', np.any(x < 0))
print('是否每行所以值都小于6:', np.all(x < 6, axis = 1))
布尔运算符 ,在实现普通的运算时可使用,多条件复合。如& = np.bitwise_and、| = np.bitwise_or、~ = np.bitwise_not及^ = np.bitwise_xor。同样符号与函数可互换。
另外,关键词and/or不可用于数组。因为在像 NumPy 这样的库中,布尔数组(元素是 True 或 False)本质上可以用 1 和 0 表示。当对布尔数组进行逻辑运算时,比如取“与”、“或”,应该使用的是 NumPy 的向量化逻辑运算函数(如 np.logical_and()、np.logical_or()),而不是 Python 的 and / or 关键字。因为 and / or 只能作用于单个布尔值,不能对整个数组做逐元素的逻辑运算。
#统计降水量大于0.5英寸且小于1英寸的天数
print(np.sum(~((inches <= 0.5) | (inches >= 1))))
布尔掩码(mask),一个与原数组形状相同的布尔值数组(True 或 False),用于标记哪些位置的元素满足某个条件,可以用来过滤数据、选择符合条件的数据点、或者对选定的数据进行修改。
import numpy as np
data = np.array([1, 2, 3, 4, 5])
# 创建一个布尔掩码:选择大于3的元素
mask = data[data>3]
print("Mask:", mask)
本项目来源于和鲸社区,使用转载需要标注来源
作者: 和鲸社区
来源: 和鲸社区
# 将所有下雨天创建一个掩码,标记下雨天
rainy = (inches > 0)
# 构建一个包含整个夏季日期的掩码(6月21是第172天)标记这一天为起始天0,则夏季为0-90天这段时间为True
summer = (np.arange(365) - 172 < 90) & (np.arange(365) - 172 > 0)
print('Medina precip on rainy days in 2014(inches) 所有降雨天的中位数: ', np.median(inches[rainy]))
print('Medina precip on rainy days in 2014(inches) 整个夏季降雨中位数: ', np.median(inches[summer]))
print('Medina precip on rainy days in 2014(inches): 整个夏季最大降雨值', np.max(inches[summer]))
print('Medina precip on rainy days in 2014(inches): 非夏季时期的下雨天的降雨中位数', np.median(inches[rainy & ~summer]))
二、索引
1.arr[arr]
arr[arr]使用一个索引数组来一次性获得多个数组元素,并且获得的结果形状与索引数组的形状一致,而不是与被索引数据的形状一致。此外,还可以将该索引与切片组合使用
import numpy as np
# 选择了X第2行到最后一行,索引2,0,1列对应的一个2X3的数组
print('X[1:, [2, 0, 1]: \n', X[1:, [2, 0, 1]])
使用花哨的索引可以实现值的修改。
import numpy as np
#覆盖式的
y = np.zeros(10)
i = [0, 1, 1, 2]
y[i] = y[i] + 1 #对比np.add.at(y, i, 1)
print(y[i], y)
2.应用
常见应用之一是从一个矩阵中选择行的子集。具体来讲,可以实现正态分布的随机数
- np.random.multivariate_normal:实现多元正态分布,生成多维数据。生成的的随机数是一个二维数组,其中每一行代表一个多维随机数据点。
- np.random.normal:实现单变量正态分布。
import numpy as np
mean = [0, 0] # 二维均值
cov = [[1, 0], [0, 1]] # 单位协方差矩阵(无相关性)
# 生成 5 个二维点
points = np.random.multivariate_normal(mean, cov, size=5)
print(points)
# 生成 5 个服从标准正态分布(均值为0,标准差为1)的一维随机数
data = np.random.normal(loc=0, scale=1, size=5)
print(data)
另一个应用是进行数据区间划分,手动创建直方图
本项目来源于和鲸社区,使用转载需要标注来源
作者: 和鲸社区
来源: 和鲸社区
import numpy as np
# 用ufun.c.at,假定有1000个值,快速统计分布在各个区间中的数据频次
np.random.seed(42)
x = np.random.randn(100)
# 手动计算直方图,生成一个[-5, 5]之间均匀生成的20个数据点,划分成20个均匀的小区间
bins = np.linspace(-5, 5, 20)
counts = np.zeros_like(bins) # 生成一个和bins数组形状一样的全零数组
print('bins:', bins)
print('counts:', counts)
# 为每个x找到合适的区间
"""
np.searchsorted(bins, x): 这是调用NumPy中的np.searchsorted函数,该函数接受两个参数:
第一个参数 bins 是已排序的数组,表示被查找的范围。
第二个参数 x 是要查找的数值。
np.searchsorted函数返回的结果是一个整数,表示在将 x 插入到 bins 数组中时,应该插入的位置。具体来说:
如果 x 小于 bins 中的所有值,那么返回值将是0,表示 x 应该插入到 bins 数组的开头。
如果 x 大于 bins 中的所有值,那么返回值将是 len(bins),表示 x 应该插入到 bins 数组的末尾。
如果 x 介于 bins 中的两个值之间,那么返回值将是介于它们之间的位置,以保持 bins 的升序顺序。
"""
i = np.searchsorted(bins, x)
# 为每个区间加上1, 计数数组counts反映的是在各个区间中的点的个数
np.add.at(counts, i, 1)
# 画出结果
plt.plot(bins, counts, linestyle = '-')
plt.show()
# 用plt.hist()一步实现上述效果
plt.hist(x, bins, histtype = 'step')
总结
会使用比较通用函数进行运算,找个数和修改值等,同时利用np.random.multivariate_normal生成二维正态分布,进行后续运算。
2816

被折叠的 条评论
为什么被折叠?



