Numpy.shape дает непоследовательные ответы - почему?

Я новичок в python. Я хотел бы знать, почему программа

import numpy as np

c = np.array([1,2])
print(c.shape)
d = np.array([[1],[2]]).transpose()
print(d.shape)

дает

(2,)
(1,2)

как его выход? Не должно быть

(1,2)
(1,2)

вместо этого? Я получил это как в python 2.7.3, так и в python 3.2.3

Спасибо!

Ответ 1

Когда вы вызываете атрибут .shape для ndarray, вы получаете кортеж с таким количеством элементов, как размеры вашего массива. Длина, т.е. Количество строк, является первым размером (shape[0])

  • Вы начинаете с массива: c=np.array([1,2]). Это простой массив 1D, поэтому его форма будет 1-элементным кортежем, а shape[0] - числом элементов, поэтому c.shape = (2,)
  • Рассмотрим c=np.array([[1,2]]). Это 2D-массив с 1 строкой. Первая и единственная строка [1,2], которая дает нам два столбца. Поэтому c.shape=(1,2) и len(c)=1
  • Рассмотрим c=np.array([[1,],[2,]]). Другой 2D-массив с 2 строками, 1 столбец: c.shape=(2,1) и len(c)=2.
  • Рассмотрим d=np.array([[1,],[2,]]).transpose(): этот массив совпадает с np.array([[1,2]]), поэтому его форма (1,2).

Другим полезным атрибутом является .size: количество элементов во всех измерениях и у вас есть массив c c.size = np.product(c.shape).

Подробнее о форме в документации.

Ответ 2

len(c.shape) - это "глубина" массива.

Для c массив - это просто список (вектор), глубина - 1.
Для d массив - это список списков, глубина - 2.

Примечание:

c.transpose()
# array([1, 2])

который не является d, поэтому это поведение не противоречит.

dt = d.transpose()
# array([[1],
#        [2]])
dt.shape # (2,1)

Ответ 3

transpose не изменяет количество измерений массива. Если c.ndim == 1, c.transpose() == c. Попробуйте:

c = np.array([1,2])
print c.shape
print c.T.shape
c = np.atleast_2d(c)
print c.shape
print c.T.shape

Ответ 4

Quick Fix: проверьте свойство .ndim - если его 2, тогда свойство .shape будет работать так, как вы ожидаете.

Причина: если свойство .ndim равно 2, то numpy сообщает значение формы, которое согласуется с соглашением. Если свойство .ndim равно 1, то numpy просто передает форму другим способом.

Больше разговоров: когда вы передаете np.array списки списков, свойство .shape будет соответствовать стандартным представлениям размеров матрицы: (строки, столбцы).

Если вы передаете np.array только список, то numpy не считает, что у него есть матрица на руках, и сообщает форму по-другому.

Вопрос в том, что numpy думает, что у него есть матрица, или он думает, что у него есть что-то еще на руках.