Numpy массив чередование строк через трансляцию - PullRequest
0 голосов
/ 10 мая 2019

У меня есть следующий код

import numpy
s = numpy.array([['210123278414410005', '101232784144610006']], dtype='object')
print(s, type(s), s.shape)
s[0][0] = s[0][0][13:]
s[0][1] = s[0][1][13:]    
print(s, type(s), s.shape)

Это дает мне желаемый результат:

[['210123278414410005' '101232784144610006']] 
[['10005' '10006']]

Как вы видите, 13 символов слева пропали.Возможно ли передать эту операцию?

Я пытался,

s[0][:] = [[s[0][0]]][0][0][13:]

Но это не дает правильный вывод, как раньше.

[['10005' '10005']] 

Ответы [ 4 ]

2 голосов
/ 11 мая 2019
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') - это большой потребитель времени, конвертирующий числа в строки.

1 голос
/ 10 мая 2019

Вы можете преобразовать элементы массива в числа, обрезать их, а затем преобразовать обратно в строки:

WIDTH = 5
MOD = 10 ** WIDTH
numpy.char.zfill((s.astype(numpy.int64) % MOD).astype('str'), WIDTH)
#array([['10005', '10006']], dtype='<U5')
1 голос
/ 10 мая 2019

Неуклюжий подход состоит в том, чтобы преобразовать вашу «числовую строку» в целое число, выполнить по модулю желаемую длину, а затем преобразовать обратно в строку:

s = numpy.mod(s[0,].astype(numpy.uint64),100000).astype('U')

, которая дает желаемый результат.

1 голос
/ 10 мая 2019

Используйте понимание

import numpy
s = numpy.array([['210123278414410005', '101232784144610006']], dtype='object')
s = np.asarray([[i[13:] for e in s for i in e]])
print(s, type(s), s.shape)

Результат:

[['10005' '10006']] <class 'numpy.ndarray'> (1, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...