2016-06-16 11 views
17

Biorę kurs witrynie Udacity na głębokiej nauki i natknąłem się na następujący kod:W numpy, co robi wybór za pomocą [:, None]?

def reformat(dataset, labels): 
    dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32) 
    # Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...] 
    labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32) 
    return dataset, labels 

Co labels[:,None] faktycznie zrobić tutaj?

Odpowiedz

15

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

numpy.newaxis

Przedmiotem newaxis może być stosowany we wszystkich operacji krojenia, aby stworzyć oś długości jeden. : const: newaxis jest aliasem dla "None", a "None" może być użyty zamiast tego z tym samym wynikiem.

http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.expand_dims.html

Demonstracja z części kodu

In [154]: labels=np.array([1,3,5]) 

In [155]: labels[:,None] 
Out[155]: 
array([[1], 
     [3], 
     [5]]) 

In [157]: np.arange(8)==labels[:,None] 
Out[157]: 
array([[False, True, False, False, False, False, False, False], 
     [False, False, False, True, False, False, False, False], 
     [False, False, False, False, False, True, False, False]], dtype=bool) 

In [158]: (np.arange(8)==labels[:,None]).astype(int) 
Out[158]: 
array([[0, 1, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 1, 0, 0]]) 
13

None jest aliasem dla NP.newaxis. To tworzy oś o długości 1. Może to być użyteczne dla macierzy multiplcation itp

>>>> import numpy as NP 
>>>> a = NP.arange(1,5) 
>>>> print a 
[1 2 3 4] 
>>>> print a.shape 
(4,) 
>>>> print a[:,None].shape 
(4, 1) 
>>>> print a[:,None] 
[[1] 
[2] 
[3] 
[4]]  
1

Przyjechałem tu po identyczny problem robi ten sam kurs witrynie Udacity. Chciałem przetransponować jednowymiarową serię/tablicę numpy, która nie działa z numpy.transpose ([1, 2, 3]). Więc chciałem dodać można transponować tak (source):

numpy.matrix([1, 2, 3]).T 

Wynika to z:

matrix([[1], 
     [2], 
     [3]]) 

który jest prawie identyczne (typ jest inny) na adres:

x=np.array([1, 2, 3]) 
x[:,None] 

Ale myślę, że łatwiej jest zapamiętać ...