Как повторить значение массива numPy - PullRequest
0 голосов
/ 30 ноября 2018

Мне было интересно, существует ли вертифицированный способ использовать два массива и на основе значения одного непрерывно копировать значение во второй массив, пока не будет найдено новое значение в первом массиве, а затем повторить весь процесс.

вот пример

   a = np.array([FALSE,TRUE,FALSE,FALSE, FALSE, TRUE, FALSE  FALSE})
   b = np.array([0,10,0,0,0,20,0,0,])
   output = array([0,10,10,10,10,20,20,20])

Я могу использовать цикл, который слишком медленный для этого.

for i in range(len(b)):   
   if b[i-1] and not b[i]:
       b[i] = b[i-1]

Обновлено:

Iпопробовал этот код ниже и увеличил скорость в 5 раз, но я думаю, что должен быть более быстрый и элегантный способ сделать это.

import numpy as np

nz= np.concatenate((np.nonzero(b)[0], [len(b)]))
np.repeat(b[np.nonzero(b)], np.diff(nz))

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Это обобщает до n размерных массивов.Он перебирает n-1d фрагменты массива.

In [26]: a=np.array([
    ...:     [ 0, 0,10, 0, 0, 0,20,30, 0, 0],
    ...:     [ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0],  
    ...:     [ 0, 5, 0, 6, 0, 7, 0, 8, 0, 9]])

In [27]: bfwd=0
    ...: for ix in range(a.shape[-1]):
    ...:     sel=np.s_[... ,ix]
    ...:     a[sel]=bfwd*(a[sel]==0)+a[sel]  # If a is zero use bfwd else use a
    ...:     bfwd=a[sel]

In [28]: a
Out[28]: 
array([[ 0,  0, 10, 10, 10, 10, 20, 30, 30, 30],
       [ 4,  4,  4,  4,  4,  4,  4,  4,  4,  4],
       [ 0,  5,  5,  6,  6,  7,  7,  8,  8,  9]])

HTH

0 голосов
/ 01 декабря 2018

Ваш пример может быть немного улучшен:

b = np.array([0, 10, 0, 0, 0, 20, 0, 0])
nz = np.squeeze(np.nonzero(b))
diffs = np.empty_like(nz)
diffs[:-1] = np.diff(nz)
diffs[-1] = b.size - nz[-1]
result = np.repeat(b[nz], diffs)

... Я не уверен, что понимаю приложение, хотя.что именно вызывает узкое место в вашем приложении.Вы также можете указать размеры ваших массивов.(Например, решение itertools может быть быстрее для меньшего количества элементов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...