转载本文请联系Python作业导师公众号。在Python语言中,in是一个使用频率很高的运算符,用于判断一个对象是否位于字符串、元组、列表、集合或字典中。in操作与人的思维方式高度一致,写起来几乎就像是一种自然语言,充分体现了Python的哲学。>>>'or'in'helloworld'True>>>5in{1,2,3,4}False>>>'age'in{'name':'Mike','age':18}真有趣是的,除了R、javascript、SQL,包括C/C++在内的主流语言几乎都不支持in操作。这或许可以解释为什么Python语言被认为是最容易学习的编程语言。习惯使用Python的in运算符,有时自然而然会应用到NumPy的数组运算中。例如,下面的语法似乎没有任何问题。>>>importnumpyasnp>>>a=np.arange(9)>>>aarray([0,1,2,3,4,5,6,7,8])>>>5inaTrue>>>10inaFalse但是,当我尝试在np.where()函数中使用in运算符时,发生了意外情况。>>>np.where(a>5)(数组([6,7,8],dtype=int64),)>>>np.where(a%2==0)(数组([0,2,4,6,8],dtype=int64),)>>>np.where(ain[2,3,5,7])Traceback(mostrecentcallast):File"",line1,in<模块>np.where(ain[2,3,5,7])ValueError:Thetruthvalueofanarraywithmorethanoneelementisambiguous.Usea.any()ora.all()使用a>5或a%2==0作为条件,np.where()function没有问题,但是在[2,3,5,7]中,np.where()会抛出异常。即使这样写,也得不到想要的结果。>>>np.where(ainnp.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的每个元素是否为素数布尔数组([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中所有素数的结果with-1array([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))(数组([0,1,1,2],dtype=int64),数组([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()函数获取两个数组的交集,自动排序。不过,我更喜欢第一种方式。