Numpy入门基础-和鲸社区(3)数组的比较与索引

笔记,代码来自和鲸社区


一、比较、掩码与布尔逻辑

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生成二维正态分布,进行后续运算。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值