In [22]: s = np.array([['210123278414410005', '101232784144610006']], dtype='object')
In [23]: s
Out[23]: array([['210123278414410005', '101232784144610006']], dtype=object)
In [24]: s.shape
Out[24]: (1, 2)
Поскольку это массив dtype объекта, хорошей отправной точкой является frompyfunc
, который также возвращает массив dtype объекта:
In [25]: np.frompyfunc(lambda s: s[13:],1,1)(s)
Out[25]: array([['10005', '10006']], dtype=object)
s[0,0]
- строка Python.s[0,0][13:]
это строковая операция.
В общем случае для работы с массивами объектов типа d требуется итерация на уровне, близком к python, даже математика.Нет встроенных numpy
операций для получения подстрок.np.char
имеет набор функций, которые применяют строковые методы к элементам массива dtype строки.Но они не очень быстрые и не включают в себя эту задачу подстроки.
Или за последние 5:
In [33]: np.frompyfunc(lambda s: s[-5:],1,1)(s)
Out[33]: array([['10005', '10006']], dtype=object)
Сравнение с ответом Колина:
In [37]: sbig = np.resize(s, (1000,1000))
In [38]: timeit np.mod(sbig.astype('uint64'),100000).astype('U')
754 ms ± 9.33 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [39]: timeit np.frompyfunc(lambda s: s[-5:],1,1)(sbig)
245 ms ± 428 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Глядя дальше, кажется, что шаг astype('U')
- это большой потребитель времени, конвертирующий числа в строки.