Итак, у меня есть большой массив в форме (n, m)
, заполненный строками. Небольшой пример:
string_array = np.array([
['hello', 'world'],
['greetings', 'all'],
['merry', 'christmas']
])
Мне нужны все первые символы каждой строки, но по какой-то причине у меня возникают проблемы. Моим первым предположением было бы использовать:
>>> string_array[:, :][0]
Что не сработало, потому что я просто беру первую строку из своей матрицы. Я хочу, чтобы результат, который вы получите, когда вы используете
>>> string_array[0, 0][0]
>>> 'h'
Но теперь для каждого элемента в моем массиве? Конечно, мне бы хотелось решение без циклов. Просто для ясности, я хочу следующее:
array([
['h', 'w'],
['g', 'a'],
['m', 'c']
])
Вы можете использовать np.vectorize
>>> np.vectorize(lambda s: s[0])(string_array)
array([['h', 'w'],
['g', 'a'],
['m', 'c']], dtype='<U1')
Хотя обратите внимание, что np.vectorize
на самом деле не «векторизует», а применяет функцию к массиву в цикле.
Редактировать: Похоже, этот вопрос уже задавали и есть хороший анализ производительности других подходов.
Спасибо за быстрый ответ. Так что в основном это скрытый цикл for? Редактировать: из документации vectorize: «Векторизованная функция оценивает pyfunc по последовательным кортежам входных массивов, как функция карты python, за исключением того, что она использует правила вещания numpy». Так что на самом деле это не скрытый цикл for, поскольку он использует широковещательную передачу numpy (если я правильно понимаю).
Да в значительной степени. Однако похоже, что есть и другие хорошие способы сделать это: ссылка Я добавлю это к своему ответу.
О, спасибо, что нашли это! Это не всплывало в моем поиске Google заранее.
np.vectorize
может на самом деле не использовать уровень Python для циклов, но скорость обычно хуже. Обычно используется np.frompyfunc
, но с некоторой дополнительной общностью. Суть в том, что он не компилирует функцию lambda
; это вызов один раз для каждого элемента ввода.
Отвечает ли это на ваш вопрос? Извлеките первую букву из каждой строки в массиве numpy