IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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 - Datové typy

V předchozí lekci, 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 stručně, jaké datové typy má Python defaultně. Ve zkratce je jich těchto pět:

  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 konzole dostaneme:

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

Pokud chceme vypsat v prostředí Jupyter Notebooku pouze jednu proměnnou, nemusíme 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.

Celý výčet včetně konstrukcí se není potřeba učit nazpaměť! Jde spíš o orientaci. A při inicializaci polí se vytvoří ten správný typ automaticky ;-)

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 sice v paměti počítače zabere místo 32 bitů rovnou 64 (respektive 128, či 256), ale někdy není zbytí.

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 spíše ve vzácných případech. 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í sekce) 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 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 a DD je den. Znak T se napíše prostě jako rozdělení data a času. HH je hodina, druhé MM je minuta a SS jsou vteřiny. 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, pokud chceme. Také můžeme neuvést např. 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 ještě ukázat, jak zjistíme konkrétní typ u NumPy objektů. Slouží pro to atribut dtype a je to velmi jednoduché. Princip funguje i pro NumPy pole.

Ukažme si příklady pro jednotlivé typy proměnných:

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.complex_(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]

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

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


 

Předchozí článek
Představení knihovny
Všechny články v sekci
NumPy - Matematika v Pythonu
Přeskočit článek
(nedoporučujeme)
Tvorba polí
Článek pro vás napsal Miloš Halda
Avatar
Uživatelské hodnocení:
10 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