Список Python может хранить что угодно вперемешку: числа, строки, другие списки. Массив NumPy устроен иначе: все его элементы одного типа (data type, dtype). Поэтому он такой быстрый и компактный — NumPy заранее знает, сколько места занимает каждое число и как с ним считать.
Какой тип у массива
Тип хранит атрибут dtype:
import numpy as np
counts = np.array([1, 2, 3])
temps = np.array([18.5, 21.0])
flags = np.array([True, False])
print(counts.dtype, temps.dtype, flags.dtype)int32 float64 bool
int— целые числа (integer); цифра — сколько бит на число:int64— 64 бита,int32— 32.float64— дробные числа (floating point).bool— логические значенияTrueиFalse.
Если в данных есть хоть одно дробное число, весь массив становится дробным — одного типа на всех:
np.array([1, 2.5, 3])array([1. , 2.5, 3. ])
Поменять тип: astype
Метод astype(тип) возвращает новый массив с элементами другого типа; исходный не меняется:
prices = np.array([99.9, 149.5, 20.99])
print(prices.astype(int))
print(prices) # исходный массив не изменился[ 99 149 20] [ 99.9 149.5 20.99]
Цены в prices записаны с копейками. Сохраните в rubles массив целых рублей без копеек.
astype(int).Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
prices = np.array([199.9, 49.5, 1250.75])
rubles = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
prices = np.array([199.9, 49.5, 1250.75])
rubles = prices.astype(int)Что получится: np.array([1.9, 2.1]).astype(int)?
astype(int) отбрасывает дробную часть: от 1.9 остаётся 1, от 2.1 — 2. Округления нет.Тип при создании: dtype=
Тип можно задать сразу — параметром dtype= у np.array, np.zeros и других функций:
print(np.zeros(3, dtype=int))
print(np.array([1, 2, 3], dtype=float))[0 0 0] [1. 2. 3.]
Создайте массив visits из семи целых нулей — счётчики посещений по дням недели.
np.zeros делает дробные нули; целые получатся с параметром dtype=int.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
visits = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
visits = np.zeros(7, dtype=int)Создайте массив ratings из оценок 4, 5, 3, 5 так, чтобы его тип сразу был дробным (float).
np.array параметр dtype=float.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
ratings = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
ratings = np.array([4, 5, 3, 5], dtype=float)Логические значения — тоже числа
True при счёте ведёт себя как 1, а False — как 0. Поэтому сумма логического массива — это сколько там
True, а среднее — какая это доля. Очень скоро, в модуле о масках, это будет главным способом считать.
answers = np.array([True, False, True, True, False])
print(answers.sum())
print(answers.mean())3 0.6
В came отмечено, пришёл ли каждый из восьми учеников (True) или нет. Сохраните в present число
пришедших, а в share — долю пришедших (от 0 до 1).
True — это сумма массива, доля — его среднее.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
came = np.array([True, True, False, True, True, True, False, True])
present = ...
share = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
came = np.array([True, True, False, True, True, True, False, True])
present = came.sum()
share = came.mean()Сколько помещается в число
Типы бывают и поменьше: np.int8 хранит целые только от −128 до 127. Если результат туда не помещается,
NumPy не предупреждает — число «перескакивает» через край:
small = np.array([100, 120], dtype=np.int8)
small + 50array([-106, -86], dtype=int8)
150 не помещается в 127, и счёт пошёл заново с −128: 150 − 256 = −106. А dtype=int8 в выводе появился потому,
что тип отличается от обычного — такие NumPy дописывает к массиву.
Такие маленькие типы нужны редко — чтобы сэкономить память на огромных данных. Главное — знать, что у целого типа есть предел.
Итоги
- У массива один тип на все элементы:
dtype—int32/int64,float64,bool. - Есть хоть одно дробное число — весь массив дробный.
astype(тип)— новый массив другого типа;astype(int)отбрасывает дробную часть.dtype=задаёт тип при создании.TrueиFalseсчитаются как 1 и 0: сумма — количество, среднее — доля.