Indeksowanie tablicy NumPy

Indeksowanie tablicy NumPy to proces pozyskiwania dostępu do poszczególnych elementów tablicy lub ich grup. Jest to ważna funkcjonalność, ponieważ pozwala na modyfikowanie lub wyodrębnianie konkretnych danych z tablicy, a także na tworzenie nowych tablic na podstawie istniejących.

Indeksowanie w NumPy odbywa się za pomocą konkretnych indeksów lub indeksów warunkowych, które określają, które elementy tablicy mają zostać wybrane. Możliwe jest również indeksowanie według kroku (tzw. slicing), dzięki czemu można wyodrębnić z tablicy co drugi, trzeci itd. element.

W artykule przedstawimy różne sposoby indeksowania tablic NumPy, począwszy od podstawowych po bardziej zaawansowane techniki. Pokażemy także, jak wykorzystać indeksowanie do modyfikowania istniejących tablic oraz do tworzenia nowych na ich podstawie.

Indeksowanie w NumPy różni się od indeksowania w standardowej liście Pythona. W przypadku tablic NumPy indeksy są odpowiedzialne za odwoływanie się do elementów tablicy w sposób ciągły, niezależnie od tego, czy tablica jest wymiarowa czy nie. To sprawia, że indeksowanie w NumPy jest bardziej wydajne i szybsze niż w przypadku list Pythona.

Poniżej znajdują się przykłady indeksowania tablicy NumPy:

  1. Indeksowanie pojedynczych elementów tablicy: (użyte funkcje: arrange() i reshape())
import numpy as np

# Tworzenie tablicy 4x4 z kolejnymi liczbami od 1 do 16
a = np.arange(1, 17).reshape((4,4))

array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

# Wybieranie pojedynczych elementów tablicy
# Aby dobrze zrozumieć przykład trzeba pamiętać że zarówno 'wiersze' jak i 'kolumny' tablicy są numerowane od wartości zero.

print(a[0, 0])  # 1     Wiersz 0 Kolumna 0
print(a[3, 2])  # 15    Wiersz 3 Kolumna 2
print(a[1, 1])  # 6     Wiersz 1 Kolumna 1

2. Wybieranie pojedynczego elementu tablicy 3D:

import numpy as np

# Tworzenie tablicy 3D z losowymi liczbami
a = np.random.randint(10, size=(4,4,4))
print(a)
# [[[4 6 8 1]
#   [7 3 9 7]
#   [5 9 4 4]
#   [7 7 5 8]]
# 
#  [[9 3 4 8]
#   [5 0 3 7]
#   [7 4 9 7]
#   [5 9 7 5]]
# 
#  [[3 2 2 5]
#   [3 7 5 6]
#   [3 4 8 0]
#   [2 4 3 8]]
# 
#  [[4 0 9 3]
#   [6 9 4 0]
#   [9 7 5 6]
#   [4 5 5 2]]]

# Wybieranie pojedynczego elementu tablicy
b = a[3, 2, 1] # Czwarta tabela (bo są numerowane od zera), drugi rząd , pierwsza kolumna
print(b)  # 7

3. Indeksowanie wielu elementów tablicy za pomocą listy indeksów:

import numpy as np

# Tworzenie tablicy 5x5 z losowymi liczbami
c = np.random.randint(0, 10, size=(5,5))

array([[2, 0, 1, 2, 6],
       [8, 6, 3, 4, 2],
       [9, 5, 2, 2, 5],
       [7, 0, 0, 0, 6],
       [9, 1, 0, 7, 2]])

# Wybieranie kilku elementów za pomocą listy indeksów
indices = [1, 3, 0, 2]

c[indices]

array([[8, 6, 3, 4, 2],   # Rząd 1
       [7, 0, 0, 0, 6],   # Rząd 3
       [2, 0, 1, 2, 6],   # Rząd 0
       [9, 5, 2, 2, 5]])  # Rząd 2

4. Indeksowanie wielu elementów tablicy za pomocą indeksów warunkowych:

import numpy as np

# Tworzenie tablicy 4x4 z kolejnymi liczbami od 1 do 16
a = np.arange(1, 17).reshape((4,4))

array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

# Wybieranie elementów spełniających określony warunek
print(a[a > 8])  

import numpy as np

# Tworzenie tablicy 4x4 z kolejnymi liczbami od 1 do 16
a = np.arange(1, 17).reshape((4,4))

array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

array([ 9, 10, 11, 12, 13, 14, 15, 16])

5.Indeksowanie za pomocą slicingu:

import numpy as np

# Tworzenie tablicy 4x4 z kolejnymi liczbami od 1 do 16
a = np.arange(1, 17).reshape((4,4))

array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

# Wybieranie co drugiego elementu z wierszy o indeksach 1 i 2
print(a[1:3, ::2]) # Interesują nas wiersze od 1 do 2 włącznie, bierzemy co drugą wartość
# [[ 5  7]
#  [ 9 11]]

############################

array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

# Wybieranie co trzeciego elementu z kolumn o indeksach 0 i 2
print(a[::3, [0, 2]])
# [[ 1  3]
#  [13 15]]

6. Tworzenie nowej tablicy z wykorzystaniem indeksowania:

import numpy as np

# Tworzenie tablicy 4x4 z kolejnymi liczbami od 1 do 16
a = np.arange(1, 17).reshape((4,4))
print(a)
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]
#  [13 14 15 16]]

# Tworzenie nowej tablicy z elementów o parzystych indeksach wierszy i nieparzystych indeksach kolumn (rozpoczynając od kolumny pierwszej)
b = a[::2, 1::2]
print(b)
# [[ 2  4]
#  [10 12]]

# Tworzenie nowej tablicy z elementów spełniających określony warunek
c = a[a > 8]
print(c)  

array([ 9, 10, 11, 12, 13, 14, 15, 16])

# Tworzenie nowej tablicy z losowych elementów istniejącej tablicy
indices = np.random.randint(0, 4, size=(2,2))
d = a[indices]
print(d) 
 # [[ 5  6]
 #  [13 14]]

W powyższych przykładach użyto różnych sposobów indeksowania tablicy: pojedynczych indeksów, indeksów warunkowych, listy indeksów, slicingu oraz indeksów losowych.