В 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]
?
Ответы
Ответ 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 для связанной оси.