设为首页 - 加入收藏  
您的当前位置:首页 >应用开发 >从Python到NumPy,细说最接近人类思维的in操作 正文

从Python到NumPy,细说最接近人类思维的in操作

来源:汇智坊编辑:应用开发时间:2025-11-05 09:34:49

本文转载自微信公众号「 Python作业辅导员」,从Pn操作者天元浪子 。到的转载本文请联系 Python作业辅导员公众号。说最思

在Python语言中,接近in是人类一个使用频率非常高的操作符,用于判断对象是从Pn操否位于字符串、元组、到的列表、说最思集合或字典中。接近in操作和人的人类思维方式高度吻合,写起来近乎于自然语言,从Pn操充分体现了Python的到的哲学理念。

>>> or in hello world True >>> 5 in {1,说最思2,3,4} False >>> age in {name:Mike, age:18} True 

有趣的是,除了R、接近javascript、人类SQL外,包括C/C++在内的主流语言几乎都不支持in操作。这或许可以解释为什么Python语言被认为是最容易学习的编程语言。站群服务器

习惯了使用Python的in操作符,有时就会自然而然地应用到NumPy数组操作上。比如,下面的写法看起来没有任何问题。

>>> import numpy as np >>> a = np.arange(9) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8]) >>> 5 in a True >>> 10 in a False 

不过,当我尝试在np.where()函数中使用in操作符的时候,出现了意外。

>>> np.where(a>5) (array([6, 7, 8], dtype=int64),) >>> np.where(a%2==0) (array([0, 2, 4, 6, 8], dtype=int64),) >>> np.where(a in [2,3,5,7]) Traceback (most recent call last):   File "<pyshell#111>", line 1, in <module>     np.where(a in [2,3,5,7]) ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

使用a>5或者a%2==0作为条件,np.where()函数没有问题,但是,使用a in [2,3,5,7],np.where()就会抛出异常。即便写成下面这样,也不能得到期望的结果。

>>> np.where(a in np.array([2,3,5,7])) (array([], dtype=int64),) 

难道NumPy不支持两个数组之间的in操作吗?不,强大到宇宙无敌的NumPy,怎么会不支持数组之间的in操作呢?NumPy不但支持,而且支持得很好。

>>> p = np.array([2,3,5,7]) # 质数数组 >>> np.in1d(a, p) # 返回a的每一个元素是否是质数的云服务器提供商布尔数组 array([False, False,  True,  True, False,  True, False,  True, False]) >>> np.where(np.in1d(a, p)) # 返回数组a中质数的索引序号 (array([2, 3, 5, 7], dtype=int64),) >>> np.where(np.in1d(a, p), -1, a) # 返回数组a中的质数全部替换为-1的结果 array([ 0,  1, -1, -1,  4, -1,  6, -1,  8]) 

np.in1d()的参数如果是多维数组,将被自动扁平化,且返回的布尔数组也是扁平化的一维数组。

>>> np.in1d(a.reshape((3,3)), p) array([False, False,  True,  True, False,  True, False,  True, False]) 

如果np.in1d()的参数是多维的,且期望返回和原数组结构相同的布尔数组,则应使用np.isin()函数。

>>> np.isin(a.reshape((3,3)), p) array([[False, False,  True],        [ True, False,  True],        [False,  True, False]]) >>> np.where(np.isin(a.reshape((3,3)), p)) (array([0, 1, 1, 2], dtype=int64), array([2, 0, 2, 1], dtype=int64)) 

若是期望得到两个数组的交集而不是交集元素的索引,下面两种方式都可行。

>>> a[np.where(np.isin(a, p))] array([2, 3, 5, 7]) >>> np.intersect1d(a, p) array([2, 3, 5, 7]) 

第二种方式直接使用np.intersect1d()函数得到两个数组的交集,且自动排序。不过,我更喜欢第一种方式。

亿华云
上一篇:以天创资本(揭秘以天创资本的投资策略与成功之道)
下一篇:KVM (Kernel Based Virtual Machine) 是一个免费的虚拟化工具,它与 VMware、Hyper-V 类似,也可以让我们在主机操作系统中创建虚拟机。KVM 在开源界已经被非常广泛地使用,这主要得益于它能够跑在支持硬件虚拟化 CPU 的所有 Linux 发行版平台之上。KVM 与 Xen 和 Hyper-V 不同的是:它不要求用户使用特定的系统及内核版本,只需要标准的 Linux 内核即可使用 KVM 创建和管理虚拟机。KVM 支持完全虚拟化技术,运行在其上的每个虚拟机都独立运行,而无需知道主机系统体系架构。说了这么多,我们就来看看如何为Ubuntu 15.04安装和配置KVM。验证CPU是否支持硬件虚拟化要跑KVM 必需要确保你 Linux 系统所在的 CPU 是支持硬件虚拟化的,不然将无法正常使用。我们可以在终端中执行如下命令进行验证:复制代码代码如下:egrep svm|vmx /proc/cpuinfo假如你的 CPU 支持,将可以看到类似如下的返回:假如 vmx 选项不可用,请重启系统并到 BIOS 中启用硬件虚拟化。为Ubuntu 15.04安装KVM一旦确认了 CPU 支持并开启硬件虚拟化之后,我们便可以使用如下命令来为 Ubuntu 15.04 安装 KVM 及相关的依赖包:复制代码代码如下:sudo apt-get install qemu-kvm qemu virt-manager virt-viewer libvirt-bin bridge-utils启用桥接网络通常情况下,为了保证虚拟机与 Internet 的相互通信,我们需要在主机中启动网络桥接。为了保证不破坏原有的网络配置,我们先使用如下命令将网络配置文件进行备份:复制代码代码如下:sudo cp /etc/network/interfaces /etc/network/interfaces-bak备份完成后,我们需要对 /etc/network/interfaces 配置文件进行更改,将如下信息追加到配置文件当中:以上信息请根据你自己的网络环境进行更改,不要照搬哦!配置完成后需要重启一下,再使用如下命令验证网络桥接是否配置成功:ifconfig启动KVM虚拟系统管理器在安装及配置完桥接网络后我们便可以使用如下命令打开 KVM 虚拟系统管理器:复制代码代码如下:sudo virt-manager点击文件菜单下的 new virtual machine 即可创建新虚拟机了。KVM 已是业界被广泛采用的一种虚拟化技术,它非常简单和易用,稳定性也非常之高。而且使用KVM 无需支付任何费用,我们可通过命令行或图形界面对其进行管理,在硬件设备支持的情况下,理论上可扩展无限虚拟机。以上就是本文的全部内容,希望对大家的学习有所帮助。

相关文章:

最新文章

0.2476s , 11668.6484375 kb

Copyright © 2025 Powered by 从Python到NumPy,细说最接近人类思维的in操作,汇智坊  滇ICP备2023006006号-2

sitemap

Top