Numpy [..., None] - PullRequest
       15

Numpy [..., None]

0 голосов
/ 02 июля 2018

Я обнаружил, что мне нужно добавить функции в существующие массивы numpy, что привело к вопросу о том, что на самом деле делает последняя часть следующего кода:

   np.ones(shape=feature_set.shape)[...,None]

Настройка

В качестве примера, скажем, я хочу решить для оценок параметров линейной регрессии, используя numpy и решение:

From Elements of Statistical Learning

Предположим, у меня есть форма набора объектов (50,1), целевая переменная shape (50,), и я хочу использовать форму моей целевой переменной, чтобы добавить столбец для значений перехвата.

Это будет выглядеть примерно так:

# Create random target & feature set
y_train = np.random.randint(0,100, size = (50,))
feature_set = np.random.randint(0,100,size=(50,1))

# Build a set of 1s after shape of target variable
int_train = np.ones(shape=y_train.shape)[...,None]

# Able to then add int_train to feature set 
X = np.concatenate((int_train, feature_set),1)

Что я думаю, что знаю

Я вижу разницу в выходных данных, когда я включаю [..., None] по сравнению с тем, когда я их отключаю. Вот оно:

enter image description here

Вторая версия возвращает ошибку вокруг входных массивов, требующих одинакового количества измерений, и в конце концов я наткнулся на решение использовать [..., None].

Основной вопрос

Хотя я вижу, что результат [..., None] дает мне то, что я хочу, я изо всех сил пытаюсь найти какую-либо информацию о , что это на самом деле должно делать. Кто-нибудь может рассказать мне, что на самом деле означает этот код, что делает аргумент None и т. Д.?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Срез [..., None] состоит из двух «горячих клавиш»:

Буквенная составляющая многоточия:

Точки (...) обозначают столько двоеточий, сколько необходимо для создания полного индексационного кортежа. Например, если x является массивом ранга 5 (т. Е. Имеет 5 осей), то

  • x[1,2,...] эквивалентно x[1,2,:,:,:],
  • x[...,3] до x[:,:,:,:,3] и
  • x[4,...,5,:] до x[4,:,:,5,:].

( Источник )

Компонент None:

numpy.newaxis

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

( Источник )

Итак, arr[..., None] принимает массив измерения N и "добавляет" измерение "в конце" для результирующего массива измерения N+1.

Пример: * +1051 *

import numpy as np

x = np.array([[1,2,3],[4,5,6]])
print(x.shape)          # (2, 3)

y = x[...,None]
print(y.shape)          # (2, 3, 1)

z = x[:,:,np.newaxis]
print(z.shape)          # (2, 3, 1)

a = np.expand_dims(x, axis=-1)
print(a.shape)          # (2, 3, 1)

print((y == z).all())   # True
print((y == a).all())   # True
0 голосов
/ 02 июля 2018

Рассмотрим этот код:

np.ones(shape=(2,3))[...,None].shape 

Как вы видите фразу «Нет», измените матрицу (2,3) на тензор (2,3,1). Фактически он поместил матрицу в индекс LAST тензора.

Если вы используете

np.ones(shape=(2,3))[None, ...].shape

это поместило матрицу в индекс FIRST‌ тензора

...