我有兩個2D numpy數(shù)組,例如:A = numpy.array([[1, 2, 4, 8], [16, 32, 32, 8], [64, 32, 16, 8]])和B = numpy.array([[1, 2], [32, 32]])我想擁有所有行,從中A可以找到的任何行的所有元素B。在的行中有2個相同元素的地方B,from的行也A必須至少包含2個。以我的示例為例,我想實現(xiàn)以下目標:A_filtered = [[1, 2, 4, 8], [16, 32, 32, 8]]我可以控制值的表示形式,因此我選擇了數(shù)字表示形式,其中二進制表示形式只有一個位置1(例如:0b00000001和0b00000010等)。這樣,通過使用np.logical_or.reduce()函數(shù),我可以輕松地檢查所有類型的值是否都在行中,但是我無法檢查連續(xù)一行中相同元素的數(shù)量是否大于或等于A。我真的希望我可以避免簡單的for循環(huán)和數(shù)組的深拷貝,因為性能對我來說是非常重要的方面。我如何以有效的方式在numpy中做到這一點?更新:這里的解決方案可能有效,但是我認為性能對我來說是一個很大的問題,它A可能真的很大(> 300000行),并且B可能是中等的(> 30):[set(row).issuperset(hand) for row in A.tolist() for hand in B.tolist()]更新2:該set()解決方案無法正常工作,因為會set()丟棄所有重復的值。
2 回答

郎朗坤
TA貢獻1921條經(jīng)驗 獲得超9個贊
我認為這應該工作:
首先,對數(shù)據(jù)進行如下編碼(假設您的二進制方案似乎暗示了“令牌”的數(shù)量有限):
制作一個形狀[n_rows,n_tokens],dtype int8,其中每個元素都計算標記的數(shù)量。以相同的方式對B進行編碼,形狀為[n_hands,n_tokens]
這樣就可以對輸出進行單個矢量化的表達。matchs =(A [None,:,:]> = B [:, None,:])。all(axis = -1)。(確切地說,如何將此匹配數(shù)組映射到所需的輸出格式作為練習的內(nèi)容留給讀者,因為問題使它在多個匹配中均未定義)。
但是我們在這里談論的是每個令牌大于10 MB的內(nèi)存。即使有了32個令牌,這也不應該是不可想象的。但是在這種情況下,最好不要對n_tokens或n_hands或兩者上的循環(huán)進行矢量化處理;對于小n,for循環(huán)很好,或者如果主體中有足夠的工作要做,則循環(huán)開銷微不足道。
只要n_tokens和n_hands保持適中,我認為這將是最快的解決方案,如果它停留在純python和numpy的領域內(nèi)。
添加回答
舉報
0/150
提交
取消