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主要有两个用途

  1. 返回源数组满足条件(single condition or multi-condition) 的元素的对应索引

  2. 由两个指定数组 按照指定条件 产生一个新数组 (也即是一个三元运算符, 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)

随机推荐

  1. 代码随想录算法训练营Day17二叉树|110.平衡二叉树  257. 二叉树的所有路径 404.左叶子之和

    优先掌握递归 110.平衡二叉树 题目链接:110.平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树_每个节点_ 的左右两个子树的高度差的绝对 ...

  2. Spring Boot 3.1中如何整合Spring Security和Keycloak

    在今年2月14日的时候,Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器.其中包括Spring Security和Spring Boot的适配器,这意味着今后Keycloak团队 ...

  3. .Net全网最简RabbitMQ操作【强烈推荐】

    [前言] 本文自1年前的1.0版本推出以来,已被业界大量科技公司采用.同时也得到了.Net圈内多位大佬的关注+推荐,文章也被多家顶级.Net/C#公众号转载. 现在更新到了7.0版本,更好的服务各位. ...

  4. Tab切换以及倒计时组件封装

    1.Tab组件 功能 支持默认选中tab 子元素可以是文本或者图片 自定义tab的数量,并自适应展示 实现方式 用ul > li标签遍历传入的tabs数组参数渲染 判断是否传入背景,未传则显示文 ...

  5. Spark架构与运行流程

    1. 阐述Hadoop生态系统中,HDFS, MapReduce, Yarn, Hbase及Spark的相互关系. 2. Spark已打造出结构一体化.功能多样化的大数据生态系统,请简述Spark生态 ...

  6. 从实验中学习ResNet模型:在视频处理任务中取得显著进展

    目录 引言 技术原理及概念 实现步骤与流程 示例与应用 优化与改进 结论与展望 "从实验中学习ResNet模型:在视频处理任务中取得显著进展" 在视频处理任务中,ResNet模型已 ...

  7. Mysql基础篇(三)之多表查询

    一. 多表关系 一对多(多对一) 多对一 一对一 1. 一对多 (1). 案例:部门与员工的关系 (2). 关系:一个部门对应多个员工,一个员工对应一个部门 (3). 实现:在多的一方建立外建,指向一 ...

  8. 前端Vue组件之仿京东拼多多领取优惠券弹出框popup 可用于电商商品详情领券场景使用

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身.通过组件化开发,可以有效 ...

  9. 详解同为4800W像素的相机传感器,三星GM1和索尼IMX586区别在哪里?

    数字影像之父Bryce Bayer基于RGB模式,通过在感光元件前加上一个滤镜的方法终于实现了彩色照片.Bayer滤镜跨出了照片从黑白到彩色的一大步,但是对于挑剔的人眼来说,每个像素只有一个颜色是远远 ...

  10. LAL v0.36.7发布,Customize Sub,我有的都给你

    Go语言流媒体开源项目 LAL 今天发布了v0.36.7版本. LAL 项目地址:https://github.com/q191201771/lal 老规矩,简单介绍一下: ▦ Customize S ...