2016-01-25 3 views
12

Очень часто массивы сжимаются с помощью np.squeeze(). В документации указано:Почему нам нужно np.squeeze()?

Удалить одномерные элементы из формы.

Однако я до сих пор интересно: Почему являются нуля и безразмерные записей в форме? Или, говоря иначе: Почему и a.shape = (2,1)и(2,) есть?

ответ

11

Помимо математических различий между двумя вещами, существует проблема предсказуемости. Если ваше предложение было выполнено, вы ни в коем случае не могли полагаться на измерение вашего массива. Таким образом, любое выражение формы my_array[x,y] должно быть заменено на то, что сначала проверяет, действительно ли my_array является двумерным и в какой-то момент не имел неявного squeeze. Это, вероятно, будет запутывать код намного больше, чем случайный squeeze, который делает четко определенную вещь.

На самом деле, может быть, даже очень сложно сказать, какая ось была удалена, что привело к множеству новых проблем.

В духе The Zen of Python, также Explicit is better than implicit, мы также можем сказать, что мы должны предпочесть явно squeeze для неявного преобразования массива.

3

Одним из примеров важности является умножение массивов. Два двумерных массива будут умножать каждое значение за раз

например.

>>> x = np.ones((2, 1))*2 
>>> y = np.ones((2, 1))*3 
>>> x.shape 
(2,1) 
>>> x*y 
array([[ 6.], 
     [ 6.]]) 

Если умножить 1d массив на 2d массив, то поведение отличается

>>> z = np.ones((2,))*3 
>>> x*z 
array([[ 6., 6.], 
     [ 6., 6.]]) 

Во-вторых, вы также можете сжать, например, ранее размеры a.shape = (1,2,2) to a.shape = (2,2)

+0

Исправлено для более обычного стиля – benj

Смежные вопросы