Нашли ошибку?
продвинутыйNumPy 2.5.3

Строки: np.strings

Поэлементные операции над массивами строк и строковый тип без ограничения длины.

Нужно знать:Типы данных и astype

Содержание статьи

Коротко

  • Модуль np.strings (NumPy 2.0+) — строковые функции, применяемые к каждому элементу: strip, upper, lower, capitalize, str_len, find, replace, startswith, slice…
  • Обычный строковый массив имеет тип <Un — строки фиксированной длины n. Более длинное значение при записи молча обрезается.
  • StringDType (NumPy 2.0+) хранит строки любой длины.
  • Старый модуль np.char работает, но новый код пишут на np.strings.
  • Для таблиц со строковыми столбцами удобнее pandas .str.

Синтаксис

np.strings.strip(a), np.strings.upper(a), np.strings.lower(a)
np.strings.str_len(a)
np.strings.find(a, sub), np.strings.startswith(a, prefix)
np.strings.replace(a, old, new)
np.strings.slice(a, start, stop)
np.array(values, dtype=np.dtypes.StringDType())

Примеры

Данные для примеровиспользуются во всех примерах ниже
cities = np.array(["  москва", "Тула ", "омск"])
codes = np.array(["SKU-101", "SKU-202", "BOX-303"])
Очистка и регистр
clean = np.strings.strip(cities)
print(clean)
print(np.strings.capitalize(clean))
np.strings.str_len(clean)
Вывод
['москва' 'Тула' 'омск']
['Москва' 'Тула' 'Омск']
array([6, 4, 4])
Поиск и замена
print(np.strings.startswith(codes, "SKU"))
print(np.strings.find(codes, "-"))
np.strings.replace(codes, "SKU", "ART")
Вывод
[ True  True False]
[3 3 3]
array(['ART-101', 'ART-202', 'BOX-303'], dtype='<U7')
Срез каждой строки
np.strings.slice(codes, 4, None)             # символы с 4-го
Вывод
array(['101', '202', '303'], dtype='<U7')
StringDType — строки любой длины
names = np.array(["Аня", "Борис"], dtype=np.dtypes.StringDType())
names[0] = "Анастасия"                        # длина не ограничена
names
Вывод
array(['Анастасия', 'Борис'], dtype=StringDType())

Подводные камни

Строка обрезается до длины типа

Тип <U5 определяется по самой длинной строке при создании массива. Всё, что длиннее, при записи теряется без предупреждения.

Запись длинной строки
names = np.array(["Аня", "Борис"])            # dtype <U5 — не больше 5 символов
print(names.dtype)
names[0] = "Анастасия"
names                                         # строка молча обрезана
Вывод
<U5
array(['Анаст', 'Борис'], dtype='<U5')

np.char и np.strings

Старый модуль np.char
np.char.upper(np.array(["a", "b"]))           # старый модуль: работает, но в новом коде — np.strings
Вывод
array(['A', 'B'], dtype='<U1')