我想根據一個數組中的值是否在另一個數組中創建一個數組。我希望下面將工作:np.fromfunction:引用其他數組
A = np.fromfunction(lambda x, y: tuple(order[x,:]) in paths[y,],\
shape=((len(order), len(paths))), dtype=int)
不幸的是,這只是產生一個標量值,而不是陣列我想要的。我可以通過如下方法對for循環做同樣的處理,但是由於涉及的值很多,這個選項非常慢。
A = np.zeros(shape=(len(order), len(paths)), dtype=int)
for i in np.ndindex(len(order), len(paths)):
r = i[0] # Row
c = i[1] # Column
x = r + c + (len(paths)-1)*r
if paths[c,] == None:
pass
elif tuple(order[r,:]) in paths[c,]:
np.put(A, x, 1, 'wrap')
有沒有人有一種有效的方式來生成目標矩陣?非常感謝你的幫助!
\編輯:非常感謝您的提示hpaulj。我認爲np.where
走向我想要實現的方向,但無法處理這兩個陣列的複雜性。我編輯了上面的方法,因爲x = r*c if r*c != 0 else r+c
沒有給我我想要的結果 - 當我的輸出是亂碼時,我不知何故地發現了它... x = r + c + (len(paths)-1)*r
確實可以唯一地標識flattend 2D數組的每個位置。我在下面列出了一些樣本,這些樣本應該能夠讓我更清楚自己想要實現的目標。對困惑感到抱歉!
order
[[ 73 6 3 1]
[ 73 6 3 2]
[ 6 116 3 1]
[ 6 116 3 2]
[116 45 3 1]
...10k additional lines...]
paths
[ [(12, 14, 1615, 1), (14, 156, 1615, 1), (156, 83, 1615, 1), (83, 37, 1554, 1), (37, 36, 1554, 1)]
[(12, 14, 1615, 2), (14, 156, 1615, 2), (156, 83, 1615, 2), (83, 37, 1554, 2), (37, 36, 1554, 2)]
[(12, 14, 1615, 1), (14, 156, 1615, 1), (156, 83, 1615, 1), (83, 37, 1554, 1), (37, 36, 1554, 1)]
[(12, 14, 1615, 2), (14, 156, 1615, 2), (156, 83, 1615, 2), (83, 37, 1554, 2), (37, 36, 1554, 2)]
[(12, 14, 1615, 1), (14, 156, 1615, 1), (156, 83, 1615, 1), (83, 37, 1554, 1), (37, 36, 1554, 1)]
[(12, 14, 1615, 2), (14, 156, 1615, 2), (156, 83, 1615, 2), (83, 37, 1554, 2), (37, 36, 1554, 2)]
...600 additional lines...]
的目標是檢查每個order
值是否是內paths
並且將其置於一個True
或1
在行/列交叉點的。所有其他交叉口應該是False
/0
。保持行和列的順序非常重要,因爲矩陣然後與有序向量相乘。實際上,我正在對此進行模擬(URL--見下文,p94)算法。該矩陣應該反映特定產品(paths
)對特定資源(order
)的利用率。