извлечь все вертикальные срезы из массива numpy

Вы можете использовать положительный прогноз вперед (?=\.|\s), чтобы остановить совпадение в этом месте:

(?<=test\s:\s).*(?=\.|\s)

Два \s в (?<=test\s:\s) будут «обрезать» совпадение. Следите за .match(), так как он будет искать только совпадение в начале строки (Авинаш алейди указал на это, но это очень важная нота!) [/ ​​G3]

См. demo

Пример кода :

import re
p = re.compile(ur'(?<=test\s:\s).*(?=\.|\s)')
test_str = u"test : match this."
print re.search(p, test_str).group()

-2
задан user308827 13 July 2018 в 20:20
поделиться

2 ответа

ndindex - удобный способ генерации индексов, соответствующих форме:

In [33]: arr = np.arange(36).reshape(4,3,3)
In [34]: for xy in np.ndindex((3,3)):
    ...:     print(xy, arr[:,xy[0],xy[1]])
    ...:     
(0, 0) [ 0  9 18 27]
(0, 1) [ 1 10 19 28]
(0, 2) [ 2 11 20 29]
(1, 0) [ 3 12 21 30]
(1, 1) [ 4 13 22 31]
(1, 2) [ 5 14 23 32]
(2, 0) [ 6 15 24 33]
(2, 1) [ 7 16 25 34]
(2, 2) [ 8 17 26 35]

Он использует nditer, но не имеет каких-либо преимуществ по скорости для вложенной пары циклов for .

In [35]: for x in range(3):
    ...:     for y in range(3):
    ...:         print((x,y), arr[:,x,y])

ndenumerate использует arr.flat как итератор, но используя его для

In [38]: for xy, _ in np.ndenumerate(arr[0,:,:]):
    ...:     print(xy, arr[:,xy[0],xy[1]])

делает то же самое, итерации на элементах подматрицы 3x3. Как и в случае ndindex, он генерирует индексы. Элемент не будет массивом размера 4, который вы хотите, поэтому я проигнорировал это.


Другой подход заключается в сглаживании более поздних осей, транспозиции, а затем просто повторении на (новом) первая ось:

In [43]: list(arr.reshape(4,-1).T)
Out[43]: 
[array([ 0,  9, 18, 27]),
 array([ 1, 10, 19, 28]),
 array([ 2, 11, 20, 29]),
 array([ 3, 12, 21, 30]),
 array([ 4, 13, 22, 31]),
 array([ 5, 14, 23, 32]),
 array([ 6, 15, 24, 33]),
 array([ 7, 16, 25, 34]),
 array([ 8, 17, 26, 35])]

или с печатью по-прежнему:

In [45]: for a in arr.reshape(4,-1).T:print(a)
2
ответ дан hpaulj 17 August 2018 в 12:10
поделиться

Почему не просто

[arr[:, x, y] for x in range(3) for y in range(3)]
0
ответ дан darksky 17 August 2018 в 12:10
поделиться
  • 1
    Я подозреваю, что это сработает, но будет очень медленным – user308827 13 July 2018 в 20:29
  • 2
    Я не понимаю, почему он должен быть медленнее, чем любая нативная функция. Если numpy имеет что-то, что может это сделать, возможно, существует некоторый внутренний цикл, который переупорядочивает данные. – darksky 13 July 2018 в 20:33
Другие вопросы по тегам:

Похожие вопросы: