簡體   English   中英

從一維數組獲取二維數組(一種鄰接矩陣)的有效方法

[英]Efficient way to get 2d array (kind of adjacency matrix) from 1d array

例如,對於一個數組a = np.array([1,2,1,0,0,1,1,2,2,2]) ,需要創建類似鄰接“矩陣” A的東西。 A是一個對稱的(n, n) numpy 數組,其中n = len(a)A[i,j] = 1如果a[i] == a[j]0否則( i = 0...n-1j = 0...n-1 ):

  0 1 2 3 4 5 6 7 8 9
0 1 0 1 0 0 1 1 0 0 0
1   1 0 0 0 0 0 1 1 1
2     1 0 0 1 1 0 0 0
3       1 1 0 0 0 0 0
4         1 0 0 0 0 0
5           1 1 0 0 0
6             1 0 0 0
7               1 1 1
8                 1 1
9                   1

簡單的解決方案是

n = len(a)
A = np.zeros([n, n]).astype(int)
for i in range(n):
    for j in range(n):
        if a[i] == a[j]:
            A[i, j] = 1
        else:
            A[i, j] = 0

這可以以一種numpy的方式完成,即沒有循環嗎?

您可以使用numpy 廣播

b = (a[:,None]==a).astype(int)
df = pd.DataFrame(b)

輸出:

   0  1  2  3  4  5  6  7  8  9
0  1  0  1  0  0  1  1  0  0  0
1  0  1  0  0  0  0  0  1  1  1
2  1  0  1  0  0  1  1  0  0  0
3  0  0  0  1  1  0  0  0  0  0
4  0  0  0  1  1  0  0  0  0  0
5  1  0  1  0  0  1  1  0  0  0
6  1  0  1  0  0  1  1  0  0  0
7  0  1  0  0  0  0  0  1  1  1
8  0  1  0  0  0  0  0  1  1  1
9  0  1  0  0  0  0  0  1  1  1

如果您只想要上三角形,請使用numpy.tril_indices

b = (a[:,None]==a).astype(float)
b[np.tril_indices_from(b, k=-1)] = np.nan
df = pd.DataFrame(b)

輸出:

     0    1    2    3    4    5    6    7    8    9
0  1.0  0.0  1.0  0.0  0.0  1.0  1.0  0.0  0.0  0.0
1  NaN  1.0  0.0  0.0  0.0  0.0  0.0  1.0  1.0  1.0
2  NaN  NaN  1.0  0.0  0.0  1.0  1.0  0.0  0.0  0.0
3  NaN  NaN  NaN  1.0  1.0  0.0  0.0  0.0  0.0  0.0
4  NaN  NaN  NaN  NaN  1.0  0.0  0.0  0.0  0.0  0.0
5  NaN  NaN  NaN  NaN  NaN  1.0  1.0  0.0  0.0  0.0
6  NaN  NaN  NaN  NaN  NaN  NaN  1.0  0.0  0.0  0.0
7  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0  1.0  1.0
8  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0  1.0
9  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM