13  Operacje na stringach

W NumPy poza dobrze znanymi tablicami liczbowymi, istnieje również zestaw funkcji pozwalających na wektorowe operacje na ciągach znaków.

Ważne: Poniższe funkcje są zazwyczaj dostępne w module numpy.char. W dokumentacji znajdują się one w sekcji String operations, jednak w tym materiale skupimy się na tym, jak można je wykorzystywać, zakładając interfejs z modułu numpy.strings. Jest to analogiczne do korzystania z numpy.char, ale jest to nowsze podejście.

13.1 Tworzenie tablic z napisami

NumPy pozwala na przechowywanie tekstu w tablicach, np. tak:

import numpy as np

arr = np.array(["python", "NumPy", "data", "Science"])
print(arr)
['python' 'NumPy' 'data' 'Science']

13.2 Podstawowe funkcje do modyfikacji tekstu

Poniżej przedstawiono popularne funkcje do modyfikacji tekstu na tablicach stringów:

13.2.1 numpy.strings.upper i numpy.strings.lower

  • upper: Zamiana wszystkich liter na wielkie.
  • lower: Zamiana wszystkich liter na małe.
import numpy as np

arr = np.array(["python", "NumPy", "data", "Science"])

print(np.strings.upper(arr))
print(np.strings.lower(arr))
['PYTHON' 'NUMPY' 'DATA' 'SCIENCE']
['python' 'numpy' 'data' 'science']

13.2.2 numpy.strings.capitalize

Funkcja capitalize zamienia pierwszą literę całego ciągu znaków na wielką, a pozostałe na małe.

import numpy as np

arr = np.array(["python", "NumPy", "data", "Science"])
print(np.strings.capitalize(arr))
['Python' 'Numpy' 'Data' 'Science']

13.2.3 numpy.strings.title

Funkcja title zamienia pierwszą literę każdego wyrazu na wielką, a pozostałe litery danego wyrazu na małe.

import numpy as np

arr2 = np.array(["python data science", "machine learning", "deep learning"])
print(np.strings.title(arr2))
['Python Data Science' 'Machine Learning' 'Deep Learning']

13.3 Łączenie i rozdzielanie tekstów

13.3.1 numpy.strings.add

Funkcja add łączy elementy tablic tekstowych parami, działając jak operator + na stringach, ale wektorowo. Łączenie odbywa się bez żadnego separatora.

import numpy as np

arr_a = np.array(["Hello", "Data"])
arr_b = np.array(["World", "Science"])

# bez separatora
print(np.strings.add(arr_a, arr_b))
# ze spacją -- trzeba ją dodać ręcznie
print(np.strings.add(np.strings.add(arr_a, np.array([" ", " "])), arr_b))
['HelloWorld' 'DataScience']
['Hello World' 'Data Science']

13.3.2 numpy.char.join

Funkcja join wstawia wskazany separator między poszczególne znaki wewnątrz każdego elementu tablicy.

import numpy as np

arr3 = np.array(["python", "numpy", "string"])
print(np.char.join("-", arr3))
['p-y-t-h-o-n' 'n-u-m-p-y' 's-t-r-i-n-g']

Uwaga: join wektoryzuje operację, traktując każdy element tablicy jako sekwencję znaków do połączenia separatorem.

13.3.3 numpy.char.split

Pozwala na rozdzielanie stringów według podanego separatora. Zwraca tablicę zawierającą listy podłańcuchów.

import numpy as np

arr4 = np.array(["python-data-science", "machine-learning"])
print(np.char.split(arr4, sep="-"))
[list(['python', 'data', 'science']) list(['machine', 'learning'])]

13.4 Wyszukiwanie i zamiana podciągów

13.4.1 numpy.strings.find i numpy.strings.rfind

  • find: Zwraca indeks pierwszego wystąpienia podłańcucha (lub -1, jeśli nie znaleziono).
  • rfind: Zwraca indeks ostatniego wystąpienia podłańcucha (lub -1, jeśli nie znaleziono).
import numpy as np

arr5 = np.array(["banana", "data", "abracadabra"])
# find -- pierwsze wystąpienie
print(np.strings.find(arr5, "a"))
# rfind -- ostatnie wystąpienie
print(np.strings.rfind(arr5, "a"))
[1 1 0]
[ 5  3 10]

13.4.2 numpy.strings.replace

replace zamienia wszystkie wystąpienia podłańcucha na nowy ciąg znaków.

import numpy as np

arr6 = np.array(["python", "pydata", "pypy"])
print(np.strings.replace(arr6, "py", "PY"))
['PYthon' 'PYdata' 'PYPY']

13.5 Usuwanie zbędnych znaków

13.5.1 numpy.strings.strip, numpy.strings.lstrip i numpy.strings.rstrip

  • strip: Usuwa wskazane znaki z początku i końca.
  • lstrip: Usuwa wskazane znaki z lewej strony (początku).
  • rstrip: Usuwa wskazane znaki z prawej strony (końca).
import numpy as np

arr7 = np.array(["   python   ", "  numpy  "])
# strip -- usuwa z obu stron
print(np.strings.strip(arr7))
# lstrip -- usuwa tylko z lewej
print(np.strings.lstrip(arr7))
# rstrip -- usuwa tylko z prawej
print(np.strings.rstrip(arr7))
['python' 'numpy']
['python   ' 'numpy  ']
['   python' '  numpy']

Możemy również podać niestandardowe znaki do usunięcia:

import numpy as np

arr8 = np.array(["###data###", "***science***"])
print(np.strings.strip(arr8, "#*"))
['data' 'science']