2017-07-12 25 views
8

'daki iki diziden gösterge matrisi oluşturun İki vektör verildiğinde bir gösterge matrisi oluşturmak istiyorum. Örneğin, a=np.array([5,5,3,4,4,4]) verilen ve b=np.array([5,4,3]), sonuçPython Numpy

5 4 3 

5 1 0 0 
5 1 0 0 
3 0 0 1 
4 0 1 0 
4 0 1 0 
4 0 1 0 

Bunu başarmak için en basit yolu nedir olmalıdır? Kullanılması

cevap

11

NumPy broadcasting -

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

Numune koşmak -

In [107]: (a[:,None]==b)*1 
Out[107]: 
array([[1, 0, 0], 
     [1, 0, 0], 
     [0, 0, 1], 
     [0, 1, 0], 
     [0, 1, 0], 
     [0, 1, 0]]) 

-

In [104]: a 
Out[104]: array([5, 5, 3, 4, 4, 4]) 

In [105]: b 
Out[105]: array([5, 4, 3]) 

In [106]: (a[:,None]==b).astype(int) 
Out[106]: 
array([[1, 0, 0], 
     [1, 0, 0], 
     [0, 0, 1], 
     [0, 1, 0], 
     [0, 1, 0], 
     [0, 1, 0]]) 

ise en basit yaparak, kompakt demek, burada tip dönüşüm yapmak için bir modifiye biri Açıklama:None is Yeni bir eksen eklemek için kullanılan numpy.newaxis için bir diğer ad (length=1 ile eksen). Yani, bu durumda, a[:,None] ile a'un 2D sürümünü alırız. Bu 2D sürümü, a.reshape(-1,1) bunlardan biri olmak için çeşitli yollar vardır. Bu, 1Db ile karşılaştırıldığı zaman broadcasting için izin verir, sonuçta bir 2B dizi eşleşmeler, bir boole dizisi oluşur. Son adım, int dizisine dönüştürmektir.

Adım adım çalıştırma -

In [141]: a 
Out[141]: array([5, 5, 3, 4, 4, 4]) 

In [142]: b 
Out[142]: array([5, 4, 3]) 

In [143]: a[:,None] 
Out[143]: 
array([[5], 
     [5], 
     [3], 
     [4], 
     [4], 
     [4]]) 

In [144]: a[:,None] == b 
Out[144]: 
array([[ True, False, False], 
     [ True, False, False], 
     [False, False, True], 
     [False, True, False], 
     [False, True, False], 
     [False, True, False]], dtype=bool) 

In [145]: (a[:,None] == b).astype(int) 
Out[145]: 
array([[1, 0, 0], 
     [1, 0, 0], 
     [0, 0, 1], 
     [0, 1, 0], 
     [0, 1, 0], 
     [0, 1, 0]]) 
+0

çok teşekkür ederiz! Tam olarak aradığım şey buydu. – David

+0

'a [:, Yok]' a.reshape (-1,1) 'ile eşdeğer gibi görünüyor. Bunun tam olarak nasıl çalıştığını açıklayabilir misiniz? – David

+0

@David Gönderiye birkaç yorum ekledi. Umarım yardım ederler! – Divakar