我有一个1D整数数组,其中的“因子”表示不同的含义。有时多个数字表示相同的含义:
import numpy as np
vec = np.arange(1, 10)
comps = {
'good': (3,),
'bad': (4, 5, 9,),
'ok': (2, 3,)
}
result = {}
for name in comps.keys():
result[name] = np.zeros(len(vec), 'bool')
for i, v in enumerate(vec):
result[name][i] = v in comps[name]
这是期望的输出。但是,当 vec
变得很大并且 comps
中的键数增加时,这会变得相当缓慢。此外,它不太好看... 在 R
中有 %in%
函数:
vec = 1:10
comp = list(
good = 3,
bad = c(4:5, 9),
ok = 2:3
)
lapply(comp, function(x) vec %in% x)
该函数会对左侧向量中的每个值与右侧向量中的每个值进行逐元素比较,并将“逻辑或”结果作为布尔向量返回,其长度与vec
相同。
使用pandas
可以更加精确和简洁:
import pandas as pd
DF = pd.DataFrame({'vec': vec})
result = {}
for name in comps.keys():
result[name] = DF.vec.apply(lambda x: x in comps[name])
与此问题类似,但我想要的是逐元素数组而不是单个布尔值作为我的结果。
在Python中,最好的方法是什么?(numpy?pandas?)