Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy.where在使用正则表达式的字符串数组上_Python_Numpy - Fatal编程技术网

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方法。非常感谢。