Python Numpy.where在使用正则表达式的字符串数组上
我有这样一个数组:Python Numpy.where在使用正则表达式的字符串数组上,python,numpy,Python,Numpy,我有这样一个数组: array = ['A0','A1','A2','A3','A4','B0','B1','C0'] 并希望获得一个数组,该数组对于后跟从0到2的数字的值为真 到目前为止,我是这样做的: selection = np.where ((array == 'A0') | (array == 'A1') | (array == 'A2'), 1, 0) 但是有没有一种更优雅的方法可以做到这一点,比如使用常规表达式,如: selection = np.where (array ==
array = ['A0','A1','A2','A3','A4','B0','B1','C0']
并希望获得一个数组,该数组对于后跟从0到2的数字的值为真
到目前为止,我是这样做的:
selection = np.where ((array == 'A0') | (array == 'A1') | (array == 'A2'), 1, 0)
但是有没有一种更优雅的方法可以做到这一点,比如使用常规表达式,如:
selection = np.where (array == 'A[0-1]', 1, 0)
我不认为numpy是你最好的解决方案。您可以使用内置的python工具(如
map
)来实现这一点
重新导入
数组=['A0'、'A1'、'A2'、'A3'、'A4'、'B0'、'B1'、'C0']
p=r'A[0-2]'
列表(映射(lambda x:bool(重新匹配(p,x)),数组))
#返回
[真,真,真,假,假,假,假,假]
#要获取数组,请执行以下操作:
数组(列表(映射(lambda x:bool)(匹配(p,x)),数组)))
#返回:
数组([True,True,True,False,False,False,False,False])
如果它不比A0
、A1
和A2
复杂,您可以使用
a = np.array(['A0','A1','A2','A3','A4','B0','B1','C0'])
np.in1d(a, ['A0', 'A1', 'A2'])
# array([ True, True, True, False, False, False, False, False])
尝试使用混合的
re
进行矢量化:
import re
array = ['A0','A1','A2','A3','A4','B0','B1','C0']
y = np.vectorize(lambda y, x: bool(re.compile(x).match(y)))
selection = np.where(y(array, 'A[0-2]'), 1, 0)
print(selection)
#output:
[1 1 1 0 0 0 0 0]
您还可以使用
列表理解
:
r = re.compile('A[0-2]')
selection = np.array([1 if re.match(r, i) else 0 for i in array])
如果选择使用熊猫:
import numpy as np
import pandas as pd
a = np.array(['A0','A1','A2','A3','A4','B0','B1','C0'])
pd.Series(a).str.match(r'A[0-2]')
# 0 True
# 1 True
# 2 True
# 3 False
# 4 False
# 5 False
# 6 False
# 7 False
# dtype: bool
这比这更复杂。我试着发布一个简单的例子。。。但是我需要设置涉及其他numpy数组的其他条件。您可以通过numpy数组构造函数传递它。查看更新。您不需要使用三元表达式,您只需使用
bool(re.compile(x.match(y))
即可,np.vectorize()
只是为了方便起见,它不会比for
循环提供任何加速。@NilsWerner我使用它是为了它的文字用途,即对函数进行向量化。这是我的第一个猜测,但我需要一个纯粹的numpy方法。非常感谢。