2017-05-18 22 views
3

Python允許一個簡單的檢查,如果一個字符串包含在另一個字符串:如何使用「in」運算符比較兩個numpy字符串數組以獲得使用數組廣播的布爾數組?

'ab' in 'abcd' 

計算結果爲True

現在來numpy字符串數組,你可以這樣做:

import numpy as np 
A0 = np.array(['z', 'u', 'w'],dtype=object) 

A0[:,None] != A0 

在布爾陣列得到的:

array([[False, True, True], 
     [ True, False, True], 
     [ True, True, False]], dtype=bool) 

讓我們現在就另一個數組:

A1 = np.array(['u_w', 'u_z', 'w_z'],dtype=object) 

我想檢查一個字符串A0不包含在中的一個字符串中,基本上是創造獨特的組合,但以下我怎麼寫了指數不產生boolean值陣列,只有一個布爾值,不管:

A0[:,None] not in A1 

我使用numpy.in1dnp.ndarray.__contains__也嘗試過,但這些方法不似乎也可以做到這一點。

性能是一個問題,所以我想充分利用numpy's優化。

我該如何做到這一點?

編輯:

,我發現這是可以做到這樣的:

fv = np.vectorize(lambda x,y: x not in y) 
fv(A0[:,None],A1) 

但作爲numpy文檔狀態:

矢量化功能主要是爲了方便而提供,而不是性能。實現本質上是一個for循環。

所以這和循環數組是一樣的,如果沒有顯式或隱式的for循環就可以解決這個問題。

+0

https://docs.scipy.org/doc/numpy/reference/generated/numpy.core.defchararray。 find.html#numpy.core.defchararray.find有一個函數庫,它將字符串方法應用於數組元素。 – hpaulj

回答

2

我們可以轉換爲string dtype,然後使用其中一個NumPy based string functions

因此,使用np.char.count,一個解決辦法是 -

np.char.count(A1.astype(str),A0.astype(str)[:,None])==0 

替代使用np.char.find -

np.char.find(A1.astype(str),A0.astype(str)[:,None])==-1 

還有一個使用np.char.rfind -

np.char.rfind(A1.astype(str),A0.astype(str)[:,None])==-1 

如果我們轉換一個str dtype,我們可以sk ip爲其他數組的轉換,因爲在內部它將完成。所以,最後的方法可以簡化成 -

np.char.rfind(A1.astype(str),A0[:,None])==-1 

採樣運行 -

In [97]: A0 
Out[97]: array(['z', 'u', 'w'], dtype=object) 

In [98]: A1 
Out[98]: array(['u_w', 'u_z', 'w_z', 'zz'], dtype=object) 

In [99]: np.char.rfind(A1.astype(str),A0[:,None])==-1 
Out[99]: 
array([[ True, False, False, False], 
     [False, False, True, True], 
     [False, True, False, True]], dtype=bool) 

# Loopy solution using np.vectorize for verification 
In [100]: fv = np.vectorize(lambda x,y: x not in y) 

In [102]: fv(A0[:,None],A1) 
Out[102]: 
array([[ True, False, False, False], 
     [False, False, True, True], 
     [False, True, False, True]], dtype=bool) 
+1

呵呵。沒有爲任何這些函數記錄允許一串字符串的'sub'參數。很高興知道這是有效的。 –

+0

@DanielF是的,甚至直到最近我才知道那些'string' funcs允許用數組提供廣播。 – Divakar

+0

這是一個很好的解決方案,但我仍然在這裏遇到了另一個問題。畢竟,我需要加入這些字符串,並且按照[這裏](https://docs.scipy.org/doc/numpy/reference/generated/numpy)的描述嘗試了'np.core.defchararray.join'。 core.defchararray.join.html),但是當例如做'np.core.defchararray.join(['a','b'],['c','d'])'輸出是'array(['c','d'],dtype =' | S1' )'。你能告訴我爲什麼嗎? – Khris

相關問題