Коротко
shape— кортеж длин по осям:(3, 4)— 3 строки, 4 столбца.ndim— число осей (len(shape)),size— всего элементов (произведениеshape).dtype— тип элементов,itemsize— байт на элемент,nbytes— байт на данные (size * itemsize).len(a)— длина только первой оси.- Это атрибуты, а не методы:
a.shape, без скобок.
Синтаксис
a.shape # (3, 4)
a.ndim # 2
a.size # 12
a.dtype # dtype('int64')
a.itemsize # 8 — байт на элемент
a.nbytes # 96 — байт на все элементы
len(a) # 3 — длина первой осиПримеры
sales = np.array([[120, 80, 45, 60],
[100, 95, 50, 70],
[130, 85, 40, 65]]) # 3 магазина × 4 товара
print("shape:", sales.shape)
print("ndim:", sales.ndim)
print("size:", sales.size)
print("dtype:", sales.dtype)
print("len:", len(sales))Вывод
shape: (3, 4) ndim: 2 size: 12 dtype: int64 len: 3
prices64 = np.zeros(1000)
prices32 = np.zeros(1000, dtype=np.float32)
print(prices64.itemsize, prices64.nbytes)
print(prices32.itemsize, prices32.nbytes)Вывод
8 8000 4 4000
week = np.zeros((7, 24, 3)) # дни × часы × датчики
week.shape, week.ndim, week.sizeВывод
((7, 24, 3), 3, 504)
Подводные камни
(3,), (3, 1) и (1, 3) — три разные формы
Одномерный вектор, столбец и строка содержат одни и те же три числа, но ведут себя по-разному в транслировании и матричном умножении.
v = np.array([1, 2, 3])
print(v.shape, v.reshape(3, 1).shape, v.reshape(1, 3).shape)Вывод
(3,) (3, 1) (1, 3)
У нульмерного массива нет длины
np.array(5) — массив с shape == (): одно значение без осей. len для него падает; число элементов даёт size.
x = np.array(5)
print(x.shape, x.ndim)
len(x)Ошибка
() 0 TypeError: len() of unsized object