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 думает, что у него есть матрица, или он думает, что у него есть что-то еще на руках.