Подтвердить что ты не робот

В numpy, что делает выбор с помощью [:, None]?

Я изучаю курс Udacity по глубокому обучению, и я натолкнулся на следующий код:

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

Что здесь делает labels[:,None]?

4b9b3361

Ответ 1

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

numpy.newaxis

Объект newaxis может использоваться во всех операциях среза для создания оси длины один.: const: newaxis - это псевдоним для "Нет", и "Нет" вместо этого можно использовать один и тот же результат.

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

Демонстрация с части вашего кода

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]])

Ответ 2

None является псевдонимом для NP.newaxis. Он создает ось с длиной 1. Это может быть полезно для матричного преобразования и т.д.

>>>> 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]]    

Ответ 3

Я приехал сюда, имея ту же самую проблему, что и тот же курс Udacity. То, что я хотел сделать, это транспонировать одномерный ряд numpy/array, который не работает с numpy.transpose([1, 2, 3]). Поэтому я хотел добавить, что вы можете транспонировать таким образом (источник):

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

Это приводит к:

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

который в значительной степени идентичен (тип отличается):

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

Но я думаю, что это легче запомнить...

Ответ 4

чтобы объяснить это простым английским языком, он позволяет выполнять операции между двумя массивами разного числа измерений.

Это достигается путем добавления нового пустого измерения, которое будет автоматически соответствовать размеру другого массива.

Так что в основном, если:

Array1 = shape [100] а также  Array2 = shape [10,100]

Array1 * Array2 обычно выдает ошибку.

Array1[:,None] * Array2 будет работать.

Ответ 5

Если вы видите код от опытных пользователей NumPy, вы часто будете видеть, что они используют специальный синтаксис среза вместо вызова изменения формы.

x = v[None, :]

или

x = v[:, None]

Эти строки создают срез, который просматривает все элементы v, но просит NumPy добавить новое измерение размера 1 для связанной оси.