2015-12-31 67 views
2

我正在嘗試爲遺傳算法做一個統一的順序交叉。在那裏,我有兩個二維數組p1和p2以及一個二維比特數組b。 p1,p2和b具有相同的形狀。我掩飾p1中的元素,對應於b中的1,p2中的元素對應於b中的0。從這些,我需要生成2個矩陣c1和c2,使得c1具有與p2中相同的元素,但是根據p1中給出的順序將空白替換爲p2中的對應值,而對於c1則爲相反。Python numpy根據另一個矩陣中的順序填充矩陣中的蒙面元素

例如:

p1 = [[1, 2, 3, 4, 5], 
     [1, 4, 3, 2, 5]] 
p2 = [[5, 4, 3, 2, 1], 
     [2, 1, 3, 4, 5]] 
b = [[1, 0, 1, 0, 1], 
    [1, 0, 0, 1, 0]] 

掩蔽陣列是MP1和MP2;

mp1 = [[1, _, 3, _, 5], 
     [1, _, _, 2, _]] 
mp2 = [[_, 4, _, 2, _], 
     [_, 1, 3, _, 5]] 

然後C1和C2是,

c1 = [[1, 4, 3, 2, 5], 
     [1, 3, 4, 2, 5]] 
c2 = [[1, 4, 3, 2, 5], 
     [4, 1, 3, 2, 5]] 

P1,P2,B,C1,C2是在我的情況維500X100000的,所以答案需要進行矢量化和高效。

+0

我目前做: C1,C2 = p2.copy,p1.copy 然後: 爲指數範圍(c1.shape [0]): C1 [指數] [一B [索引]] = p1 [索引] [np.in1d(p1 [索引],p2 [索引] [〜b]] 但修改c1的副本而不是c1的直接,所以我無處可去 – Aditya369

回答

0

我無法準確理解您究竟在問什麼,因爲您在問題中輸入了錯字,或者我完全忽略了這一點。

所以,首先我們有P1

mp1 = [[1, _, 3, _, 5], 
     [1, _, _, 2, _]] 

其中_值應該從P2對應的值來代替口罩。這應該是

[[_, 4, _, 2, _], 
[_, 1, 3, _, 5]] 

所以在我的腦海結果應該是

[[1, 4, 3, 2, 5], 
[1, 1, 3, 2, 5]]) 

,但你說該預期的結果

[[1, 4, 3, 2, 5], 
[1, 3, 4, 2, 5]] 

3如何出現在那裏並哪裏4來從?我錯過了什麼? (有人認爲這對我之前,我不能評論符合這個)

如果你可以使用numpy,併爲這樣的東西,我建議你這樣做,該解決方案,以最好的我的解釋能力,將是:

p1 = [[1, 2, 3, 4, 5], 
     [1, 4, 3, 2, 5]] 
p2 = [[5, 4, 3, 2, 1], 
     [2, 1, 3, 4, 5]] 
b = [[1, 0, 1, 0, 1], 
    [1, 0, 0, 1, 0]] 

#this is just how you turn python lists into numpy arrays 
import numpy as np 
p1 = np.asarray(p1) 
p2 = np.asarray(p2) 
b = np.asarray(b) 

#this is the actual solution to the problem 
p1[b==0] = p2[b==0] 

這些取代均在地方完成的,所以它的記憶不錯,他們在C中的背景,這意味着它是快如閃電基本上完成了。

+0

可以這樣考慮,c2包含與p1具有完全相同的元素,但是順序不同,c1與p2具有完全相同的元素,但順序不同,順序由另一個矩陣給出。基本上是從1到5的數字排列。該屬性也必須適用於兒童。不能有重複。我所複製的所有內容另一個矩陣是它們存在的順序。 – Aditya369

+0

讓我們做一個單行。 p1是52341,p2是31254,b是10101。爲了產生c1,取p2 * b1給出30204.現在需要填充零。由於每行必須包含來自父項的相同元素,因此c1必須包含來自p2的所有元素,但順序必須是它們在p1中出現的順序。缺失的元素是1和5.它們在p1中的順序是5,1。所以按照這個順序填零,第一個零爲5,第二個爲1。所以c1變成了35214.注意它具有與p2相同的元素,並且3,2,4與p2中的位置和順序相同。 1,5由p1s填寫訂單 – Aditya369

+0

我正在使用numpy。我希望喜歡解決方案只能使用numpy數組函數。 – Aditya369

相關問題