Нашли ошибку?
Скачать чистый
урок 3 из 5≈ 15 минупражнения: 0 из 4

Типы данных

У всех элементов массива один тип — целый, дробный или логический. Как его узнать и поменять и почему astype(int) отбрасывает дробную часть.

Python запустится при первом выполнении

Список 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]
[ ]Упражнение 1Целые рубли решено

Цены в prices записаны с копейками. Сохраните в rubles массив целых рублей без копеек.

prices = np.array([199.9, 49.5, 1250.75])
rubles = ...

Вопрос

Что получится: np.array([1.9, 2.1]).astype(int)?

Тип при создании: 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.]
[ ]Упражнение 2Счётчики посещений решено

Создайте массив visits из семи целых нулей — счётчики посещений по дням недели.

visits = ...

[ ]Упражнение 3Оценки как дробные решено

Создайте массив ratings из оценок 4, 5, 3, 5 так, чтобы его тип сразу был дробным (float).

ratings = ...

Логические значения — тоже числа

True при счёте ведёт себя как 1, а False — как 0. Поэтому сумма логического массива — это сколько там True, а среднее — какая это доля. Очень скоро, в модуле о масках, это будет главным способом считать.

[ ]Сумма True
answers = np.array([True, False, True, True, False])
print(answers.sum())
print(answers.mean())
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
3
0.6
[ ]Упражнение 4Кто пришёл решено

В came отмечено, пришёл ли каждый из восьми учеников (True) или нет. Сохраните в present число пришедших, а в share — долю пришедших (от 0 до 1).

came = np.array([True, True, False, True, True, True, False, True])
present = ...
share = ...

Сколько помещается в число

Типы бывают и поменьше: np.int8 хранит целые только от −128 до 127. Если результат туда не помещается, NumPy не предупреждает — число «перескакивает» через край:

[ ]Переполнение int8
small = np.array([100, 120], dtype=np.int8)
small + 50
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
array([-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: сумма — количество, среднее — доля.

Подробнее в справочнике

Нашли ошибку?