我知道以下逻辑操作适用于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)吗?
谢谢!
答案 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