numpy_tricks
Numpy Tricks
这篇文章不定期更新,主要是记录在使用numpy过程中一些有效的tricks(或者重要的API)
import numpy as np
numpy.where()
numpy.where(condition, [,x,y])
参数:
- condition: 一个 bool array 或者 在源数组(original array)基础上由条件运算产生的 bool array
- x,y(optional, 或者两者都被传入函数,或者都不被传入): 两个和condition 产生的 bool array 具有相同的shape 的 array
因此numpy.where中或者有一个参数,或者有三个参数,而不会只有两个参数
返回值
- 如果x 与 y 均被传入, 那么它基于bool array 从 x 和 y 中选取元素 组成一个新的数组。原理: 遍历bool array, 如果bool array 某一位置的元素为True,那么从 x(array1) 中选取对应位置的元素作为新数组对应位置的元素, 如果为 False,从 y(array2) 中选择, 最终由 x的元素和 y 的元素组成一个新的数组
- 如果 x 与 y 均不被传入,那么它返回一个元组,每一个元组元素对应 original 数组 的某一维度 满足 condition元素的索引
因此numpy.where主要有两个用途
返回源数组满足条件(single condition or multi-condition) 的元素的对应索引
由两个指定数组 按照指定条件 产生一个新数组 (也即是一个三元运算符, x if condition else y, 只不过这里的 x y condition 拓展到了数组版本)
接下来是两个简单的例子(直接展示二维的情况,更高维或者一维与此类似)
# 创建源数组
o_array = np.arange(0, 9).reshape((3, 3))
# 创建 x ,y
x = np.array(['high value']*9).reshape((3, 3))
y = np.array(['low value']*9).reshape((3, 3))
print(f'x=: \n{x}')
print(f'y=: \n{y}')
print(f'original=: \n{o_array}')
x=:
[['high value' 'high value' 'high value']
['high value' 'high value' 'high value']
['high value' 'high value' 'high value']]
y=:
[['low value' 'low value' 'low value']
['low value' 'low value' 'low value']
['low value' 'low value' 'low value']]
original=:
[[0 1 2]
[3 4 5]
[6 7 8]]
# 单个条件或者许多条件, 当然也可以直接使用bool array
single_condition = o_array >= 4
multi_condition = (o_array>=4) & (o_array<=6)
# 用法一 返回满足条件的元素的索引
idx_1 = np.where(single_condition)
idx_2 = np.where(multi_condition)
print(f'单个条件返回的索引元祖为: {idx_1}') # 分别对应满足条件元素二维索引的横竖index
print(f'多个条件返回的索引元祖为: {idx_2}')
# 返回的元祖可以用于 索引相应满足条件的元素
elements = o_array[idx_1]
print(f"满足条件的元素: {elements}")
# 也可以对于返回tuple元素进行合并 得到相应的二维索引
index = list(zip(idx_1[0], idx_1[1]))
print(index)
单个条件返回的索引元祖为: (array([1, 1, 2, 2, 2]), array([1, 2, 0, 1, 2]))
多个条件返回的索引元祖为: (array([1, 1, 2]), array([1, 2, 0]))
满足条件的元素: [4 5 6 7 8]
[(1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
# 用法二:作为三元表达式的一种创建一个新数组
new_array = np.where(single_condition, x, y)
print(f'新数组为: \n{new_array}')
新数组为:
[['low value' 'low value' 'low value']
['low value' 'high value' 'high value']
['high value' 'high value' 'high value']]
numpy.any()、ndarray.any() (numpy.all(), ndarray.all())
关于详细的背景知识和使用,这里有一个不错的英文教程
np.any(input_array, axis, output, keepdims, where)
参数:
input_array: 输入数组或者 array-like (如python list)
axis: 指定的运算轴, default = None, 维度可以为负数,即反向索引
output: 可以指定输出的数组,这个参数很少使用
keepdims: 决定输出是否要保留和输入一样的维度数
where: array of bol optional, 用于指定函数运算的位置
返回:
bool 值 或者一个bool array(在指定维度运算时)
功能:
检查 input_array 中在指定的位置(或者指定的维数)上是否存在 True。
一种典型的应用场景是 np.any(condition)
np.all() 的用法和np.any() 完全相同,区别在于字面意思 any vs all
input_array = np.arange(0, 9).reshape((3, 3))
condition = input_array >=4
print(f"默认缺省: {np.any(condition)}")
print(f"指定维度: {np.any(condition, axis=1)}")
print(f"指定维度的输出shape: {np.any(condition, axis=1).shape}")
print(f"keepdims 时的shape: {np.any(condition, axis=1, keepdims=True).shape}")
默认缺省: True
指定维度: [False True True]
指定维度的输出shape: (3,)
keepdims 时的shape: (3, 1)
随机推荐
- 连接内网 SSH 新姿势,告别慢速度及防火墙限制
近些年,因为某些原因,我们常常在家远程研发业务,当某些程序或业务代码在公司电脑上时,就需要访问公司电脑远程操作, SSH 登录 Linux 是一种非常常见的方式,但是在一些情况下,SSH 无法直接连接 ...
- Golang扫盲式学习——GO并发 | (一)
并发与并行 并发与并行的概念和区别 并行:同一个时间段内多个任务同时在不同的CPU核心上执行.强调同一时刻多个任务之间的"同时执行". 并发:同一个时间段内多个任务都在进展.强调多 ...
- 安卓第一课:gradle仓库的导入
今天装好android studio,结果刚进入就报错了: SSL peer shut down incorrectly 读注释发现原来是gradle下载文件不成功.果然,原来是vpn掉线了,上网查了 ...
- pytorch的torch、torchvision、torchaudio版本对应关系
torch与torchvision对应关系 torch与torchaudio对应关系
- gitlab docker升级报错
背景 使用docker部署gitlab(9.5.4)后,发现合并代码有问题 日志: 看gitlab官网此问题已修复,由于上传了一批代码,又懒得重建,决定对gitlab升级 docker启动命令: do ...
- ModelBox实战开发:RK3568实现摄像头虚拟背景
摘要:本文将使用ModelBox端云协同AI开发套件(RK3568)实现摄像头虚拟背景AI应用的开发. 本文分享自华为云社区<ModelBox开发案例 - RK3568实现摄像头虚拟背景[玩转华 ...
- uniapp微信小程序转支付宝小程序踩坑(持续更新)
首先第一个,真有被折磨到! // 微信正常使用,支付宝不行 <image src="https://static.dabapiao.com/images/coupon-index.pn ...
- 解决Springboot项目打成jar包后获取resources目录下的文件失败的问题
前几天在项目读取resources目录下的文件时碰到一个小坑,明明在本地是可以正常运行的,但是一发到测试环境就报错了,说找不到文件,报错信息是:class path resource [xxxx] c ...
- LeetCode 周赛 352(2023/07/02)一场关于子数组的专题周赛
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问. 往期回顾:LeetCode 单周赛第 350 场 · 滑动窗口与离 ...
- 华为云GaussDB亮相2023可信数据库发展大会,荣获三项评测证书!
摘要:2023可信数据库发展大会上,华为云数据库服务产品部总经理苏光牛围绕华为云GaussDB的产品能力和实践进行了分享 本文分享自华为云社区<华为云GaussDB亮相2023可信数据库发展大会 ...