所以我有兩個陣列,看起來就像下面這樣:
我有兩個陣列。
x1 = np. array([['a','b','c'], ['d', 'a','b'],['c','a,c','c']]
x2 = np.array(['d','c','d'] )
我想檢查x2中的每個元素是否存在于x1的對應列中。所以我嘗試:
print((x1==x2).any( axis=0)
#array([ True, False, False])
注意,x2[1] in x1[2,1] == True。問題是,有時我們要找的一個元素在x1中的一個元素里面(如果我們用逗號分割,它可以被識別)。所以我想要的輸出是:
array([ True, True, False])
有沒有一種方法可以使用numpy(或pandas)的本地方法來做呢?
uj5u.com熱心網友回復:
你可以vectorize一個函式來廣播x2 in x1.split(','):
@np.vectorize。
def f(a, b) 。
return b in a.split(' ,')
f(x1, x2).any( axis=0)
# array([ True, True, False])
注意,"矢量化 "是一個錯誤的說法。這不是真正的矢量化,只是一種方便的方式來廣播一個自定義的函式。
既然你在括號中提到了 pandas,另一個選擇是
應用一個分割/成員函式到 df = pd.DataFrame(x1)的列。
然而,numpy函式的速度明顯要快得多:
。f(x1, x2).any(axis=0) # 24.2 μs ± 2.8 μs
df.apply(list_comp).any() # 913 μs ± 12.1 μs
df.apply(combined_in).any() # 1.8 ms ± 104 μs
df.apply(expand_eq_any).any() # 3.28 ms ± 751 μs
# 使用串列理解來做分割和成員檢查:
def list_comp(col)。
return [x2[col.name] in val.split(',') for valin col]
# 拆分整列并使用`combine`來檢查`x2 in x1`。
def combine_in(col)。
return col.str.split(', ')。 combine(x2[col.name], lambda a, b: b in a)
# 將列分成擴展列并檢查擴展行是否匹配。
def expand_eq_any(col)。
return col.str.split(', ', expand=True) 。 eq(x2[col.name]).any( axis=1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/326863.html
標籤:
上一篇:我如何解決這個錯誤?TypeError:_append_dispatcher()缺少1個必要的位置引數:'values'。
