NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 2 - NumPy - Datové typy

V předchozí lekci, NumPy - Představení knihovny, jsme se dověděli základní informace o knihovně NumPy. Naučili jsme se, jak knihovnu přidat do svého Python prostředí a nainstalovali si Jupyter Notebook.

V tomto tutoriálu knihovny NumPy v Pythonu se nejprve podíváme na to, jaké nové datové typy knihovna do Pythonu přináší. Dále si vysvětlíme, k čemu se nám budou hodit a jak je používat.

Nativní datové typy v Pythonu

Ještě než se pustíme do datových typů v NumPy, připomeňme si, jaké datové defaultní datové typy Python má:

  1. string - řetězec znaků,
  2. integer - celé číslo,
  3. float - číslo s desetinou čárkou,
  4. complex - komplexní číslo,
  5. bool - logická hodnota.

Jak zjistit datový typ proměnné?

V Pythonu je zabudovaná funkce type(). Ta nám může pomoct získat přehled o tom, s jakým typem proměnné zrovna pracujeme:

print(type("Hello World!"))
print(type(123))
print(type(3.141592))
print(type(complex(2,1)))
print(type(True))

Ve výstupu do konzole dostaneme:

Zjištění typu proměnné:
class 'str'
class 'int'
class 'float'
class 'complex'
class 'bool'

Pokud chceme v prostředí Jupyter Notebooku vypsat pouze jednu proměnnou, nemusíme ji psát do funkce print(). Stačí ji jen volně nechat na konci bloku kódu. Tuto techniku ale není možné použít při programování v jiných IDE, v konzoli ani při skriptování!

Datové typy v NumPy

Konečně se dostáváme k datovým typům z knihovny NumPy. Knihovna používá vlastní datové typy založené na programovacím jazyku C. Díky tomu jsou operace NumPy rychlejší než je v Pythonu běžné.

Pozor, teď neřešíme objekty typu NumPy array, ale to, co do nich budeme vkládat.

Pro vytváření proměnných daných typů v ukázkách níže musíme mít importovaný numpy pod aliasem np:

import numpy as np

Zkratka np se pro NumPy používá v praxi běžně. Klidně bychom ale mohli as np vynechat a v ukázkách kódu používat slovo numpy. Funguje to stejně.

Opět si nejprve uděláme přehled datových typů, tentokrát i se zkratkami, pod nimiž NumPy dané typy používá:

  • U - unicode string (řetězec unicode znaků),
  • i - integer (celé číslo),
  • u - unsigned integer (nezáporné celé číslo),
  • f - float (číslo s desetinnou čárkou),
  • c - complex (komplexní číslo),
  • b - boolean (logická proměnná),
  • M - datetime (datum a čas).

Nejedná se o celý výčet, ale o výběr těch, se kterými se nejčastěji setkáme. NumPy používá tyto znaky, abychom mohli snadno zjistit, o jaký typ se jedná a zároveň, aby se typy nepletly s běžnými nativními typy Pythonu.

Jednotlivé datové typy NumPy

Pojďme se podívat na jednotlivé datové typy konkrétně.

U - unicode string (řetězec unicode znaků)

Tento datový typ je ekvivalentní typu string v Pythonu.

Vytvoříme ho takto:

s = np.str("Hello World!")

Stejně jako string v Pythonu, i typ U má nejrůznější metody, které se na něj dají použít. Velkou část z nich je možné najít v modulu np.char.

i - integer (celé číslo)

Typ i je ekvivalentní typu integer v Pythonu. V určitých případech se nám bude hodit, že jej lze definovat také jako int32, int64 a dokonce můžeme použít i libovolnou další mocninu dvojky od 8 do 256. Standardně se používá int32, ale pro velmi velká čísla je potřeba použít jeho násobnou verzi. Pak v paměti počítače zabere místo 32 bitů rovnou 64 (respektive 128, či 256).

Pro vytvoření proměnné tohoto typu použijeme následující kód:

muj_int32 = np.int32(64) # Čísla v argumentu jsou dána jen jako příklad.

muj_int64 = np.int64(1325) # Ve skutečnosti mohou být libovolná.

Pokud chceme, aby se počet bitů zvolil automaticky, napíšeme místo počtu bitů podtržítko _:

muj_int = np.int_(42)

u - unsigned integer (nezáporné celé číslo)

Tento typ využijeme vzácně. Oproti typu integer totiž unsigned integer neumožňuje jít pod nulu. Využijeme jej například pokud optimalizujeme množství využité paměti během běhu programu a přitom pracujeme s velmi vysokými nezápornými čísly.

Stejně jako integer, i typ u je možné použít ve variantě s větším rozsahem bitů. Pokud použijeme konstruktor bez čísla, počet bitů se zvolí automaticky. Oproti konstruktoru typu integer (viz předchozí kapitola) se ale nepíše podtržítko za názvem:

muj_uint = np.uint(23)

f - float (číslo s desetinnou čárkou)

Typ f je ekvivalent datového typu float v Pythonu. Opět lze zvolit počet bitů při vytváření proměnné. Nebo můžeme takto použít konstruktor s podtržítkem, jako v případě typu i:

muj_float = np.float_(1.414)

U typu float se v praxi často stává, že nám záleží na co nejdelší části za desetinou čárkou bez zaokrouhlení. Proto se pro "dvojnásobný float" (tedy vlastně float32) zavedl typ double. I takto je možné float v NumPy inicializovat:

muj_double = np.double(3.141592)

c - complex (komplexní číslo)

Komplexní čísla se vytvoří jednoduše z komplexních čísel, jak je známe v Pythonu:

muj_complex = np.complex_(complex(2, 3))

b - boolean (logická proměnná)

Podobně jako předchozí typy, i boolean se vytváří a funguje podobně, jako ho běžně známe v Pythonu:

muj_bool = np.bool_(True)

Podtržítko za klíčovým slovem bool není u tohoto typu povinné. Zápisy np.bool_(True) a np.bool(True) jsou tak ekvivalentní. Většina programátorů však volí zkrácenou variantu np.bool(True), protože je kratší a čitelnější.

M - datetime (datum a čas)

Pro uložení času do proměnné slouží typ datetime. Způsob vytvoření této proměnné je opět jednoduchý. Čas se zadává ve formátu RRRR-MM-DDTHH:MM:SS, kde:

  • RRRR je rok,
  • MM je měsíc,
  • DD je den,
  • HH jsou hodiny,
  • MM jsou minuty,
  • SS jsou vteřiny.

Znak T píšeme jako rozdělení data a času.

Do vteřin je možné dát za desetinnou čárku i přesnější vyjádření. Navíc nám typ dovoluje napsat jen datum či jen čas. Také nemusíme například uvést vteřiny. Pojďme si ukázat několik příkladů:

# 20. července 2023, 17h 23min 10.42s
muj_datetime1 = np.datetime64('2023-07-20T17:23:10.42')
# 20. července 2023
muj_datetime2 = np.datetime64('2023-07-20')
# funguje i bez dnů
muj_datetime3 = np.datetime64('2023-07')

Jak zjistit typ obsažený v NumPy objektu

Na závěr si pojďme ukázat, jak zjistíme konkrétní typ u NumPy objektů. Slouží pro to atribut dtype:

muj_int32 = np.int32(64)
print(muj_int32.dtype)  # int32

muj_int64 = np.int64(1325)
print(muj_int64.dtype)  # int64

muj_uint = np.uint(23)
print(muj_uint.dtype)  # uint64

muj_float = np.float32(1.414)
print(muj_float.dtype)  # float32

muj_double = np.double(3.141592)
print(muj_double.dtype)  # float64

muj_complex = np.complex128(complex(2, 3))
print(muj_complex.dtype)  # complex128

muj_bool = np.bool_(True)
print(muj_bool.dtype)  # bool

muj_datetime = np.datetime64('2023-07-20T17:23:10.42')
print(muj_datetime.dtype)  # datetime64[ms]

Ve výstupu uvidíme:

Typy proměnných:
int32
int64
uint32
float32
float64
complex128
bool
datetime64[ms]

Princip funguje i pro NumPy pole.

To je k základním datovým typům NumPy vše.

V následující lekci, NumPy - Tvorba polí, si ukážeme, jak vytvořit pole knihovny NumPy ndarray pomocí již známých seznamů Pythonu i pomocí metod, které nabízí sama knihovna NumPy.


 

Předchozí článek
NumPy - Představení knihovny
Všechny články v sekci
NumPy - Matematika v Pythonu
Přeskočit článek
(nedoporučujeme)
NumPy - Tvorba polí
Článek pro vás napsal Miloš Halda
Avatar
Uživatelské hodnocení:
36 hlasů
Autor se věnuje především bioinformatice a s ní souvisejícím tématům. Nevyhýbá se OOP jazykům, statistice a nástrojům pro analýzu dat.
Aktivity