Python中使用字符串数组的逻辑运算

时间:2016-09-23 17:08:52

标签: python string numpy logical-operators

我知道以下逻辑操作适用于numpy:

A = np.array([True, False, True])
B = np.array([1.0, 2.0, 3.0])
C = A*B = array([1.0, 0.0, 3.0])

但如果B是一个字符串数组,则情况并非如此。是否可以执行以下操作:

A = np.array([True, False, True])
B = np.array(['eggs', 'milk', 'cheese'])
C = A*B = array(['eggs', '', 'cheese'])

这是一个乘以False的字符串应该等于一个空字符串。这可以在没有Python循环的情况下完成(不必使用numpy)吗?

谢谢!

3 个答案:

答案 0 :(得分:5)

您可以使用np.where根据掩码进行此类选择 -

np.where(A,B,'')

示例运行 -

In [4]: A
Out[4]: array([ True, False,  True], dtype=bool)

In [5]: B
Out[5]: 
array(['eggs', 'milk', 'cheese'], 
      dtype='|S6')

In [6]: np.where(A,B,'')
Out[6]: 
array(['eggs', '', 'cheese'], 
      dtype='|S6')

答案 1 :(得分:2)

由于字符串可以乘以整数,而布尔值是整数:

A = [True, False, True]
B = ['eggs', 'milk', 'cheese']
C = [a*b for a, b in zip(A, B)]
# C = ['eggs', '', 'cheese']

我仍然使用某种循环(与numpy解决方案相同),但它隐藏在简明列表理解中。

可替换地:

C = [a if b else '' for a, b in zip(A, B)]  # explicit loop may be clearer than multiply-sequence trick

答案 2 :(得分:2)

UPDATE MODELOS m SET m.ID_MARCA = (SELECT f.ID_MARCA FROM FILE f WHERE f.MARCA = m.MARCA LIMIT 1 ); 将字符串方法应用于数组元素:

np.char

我必须将布尔值转换为整数,然后将其放在第二位。

其他问题的时间表明In [301]: np.char.multiply(B, A.astype(int)) Out[301]: array(['eggs', '', 'cheese'], dtype='<U6') 迭代并应用Python方法。速度与列表理解大致相同。

对于就地更改,请使用蒙版分配而不是np.char

where