2016-09-23 25 views
2

字符串数组逻辑运算,我知道下面的逻辑运算与numpy的工作:可以用Python

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)?

谢谢!

回答

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') 
2

由于串可以用整数相乘,布尔是整数:

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

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

或者:

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

“我仍然使用一些类型的循环(同numpy的解决方案),但它隐藏在简洁的列表理解。” - 一般来说,当使用NumPy时,你希望你的循环在C中发生,而不是在列表解析中。 C循环可以避免大量的开销。 Python循环通常比数十到数千倍慢。 – user2357112

+2

@ user2357112说实话,我不清楚OP是否使用numpy,因为他确实需要强大的线性代数工具箱,或者仅仅因为这是他知道分段操作的唯一方法。在numpy数组中存储字符串是非常奇特的,它不会像你将做矩阵向量乘法一样...我只是提供了一个替代方案,不需要使用numpy_。随意投票或反对票。 –

2

np.char适用字符串方法添加到数组的元素:

In [301]: np.char.multiply(B, A.astype(int)) 
Out[301]: 
array(['eggs', '', 'cheese'], 
     dtype='<U6') 

我不得不布尔到整数转换,并且第二放置。

其他问题的时间表示np.char迭代并应用Python方法。速度与列表理解相同。

对于就地变化,用蒙面分配的,而不是where

In [306]: B[~A]='' 
In [307]: B 
Out[307]: 
array(['eggs', '', 'cheese'], 
     dtype='<U6')