Numpy:在比较中获取包含True的数组元素

时间:2017-02-01 12:38:50

标签: python arrays numpy

#include <12F1822.h>
#include <String.h>
#fuses NOMCLR INTRC_IO PLL_SW
#use delay(clock=32000000)

#use rs232(baud=9600, xmit=Pin_A0, rcv=Pin_A1,enable=Pin_A2, bits=8, errors, stream=RS485)

void clear_usart_receiver(void) {
    char c;
    c = getc();
    c = getc();
}
int id [] = {0, 2};

void main() {

    while (1) {
        byte message[10];
        fgets(message, RS485);
        delay_ms(10);
        if (message[0] == '2')

        {
            fputs("s2 reply", RS485);
        }
        delay_ms(10);
        clear_usart_receiver();
    }
}

import numpy as np import re list1= ['651ac1', '21581', '13737|14047', '22262', '12281', '12226', '61415', '61495'] regexp = '[a-zA-Z]' selection = np.array([bool(re.search(regexp, element)) for element in list1]) if True in selection: #get_element_containing_true 看起来像这样:

selection

我想获得包含True的数组元素。我怎么得到这个?

2 个答案:

答案 0 :(得分:3)

这里你真的需要numpy(如果你没有,请参见@Divakar's answer)?如果您这样做,您可以将list1转换为np.array并将索引:

np.array(list1)[selection]

这称为boolean array indexing。以防你感兴趣。

只是一个性能提示:如果你多次使用正则表达式:编译它并重用那个已编译的表达式:

regexp = re.compile('[a-zA-Z]')
selection = np.array([bool(regexp.search(element)) for element in list1])

这可以更快,更容易与其他答案相结合。

答案 1 :(得分:2)

您可以直接获取list-comprehension -

中的内容
[element for element in list1 if bool(re.search(regexp, element))]

仔细看看,使用搜索方法,我们得到一个匹配的对象:

In [175]: re.search(regexp, list1[0])
Out[175]: <_sre.SRE_Match at 0x7fc30bac1c60>

对于不匹配的情况,我们得到None

根据definitions of booleans

  

在布尔运算的上下文中,以及表达式时   在控制流语句中使用时,将解释以下值   as false:False,None,所有类型的数字零和空字符串   和容器(包括字符串,元组,列表,字典,集合   和frozensets)。所有其他值都被解释为true。   用户定义的对象可以通过提供a来自定义其真值    bool ()方法。

因此,如果搜索方法结果直接输入IF,我们会获得匹配的对象,而None则没有匹配。因此,使用IF定义时,匹配将被评估为TrueFalse。因此,我们可以跳过那里的bool()并有一个简化版本,如此 -

[element for element in list1 if re.search(regexp, element)]
相关问题