Как эффективно изменить элементы массива в зависимости от условия - PullRequest
0 голосов
/ 24 октября 2018

У меня есть трехмерный массив uint8 numpy.Я хочу увеличить все элементы на 1, который имеет эти значения: 0,1,3,16,17,18.И установите другие в 0. Я попытался использовать традиционные для циклов, который действительно очень медленно.

Попытка использования методов индексации Python для установки других значений на 255 (которые впоследствии будут изменены на 0)

mask[(mask[:,:,:] != 0) & (mask[:,:,:] != 1) & (mask[:,:,:] != 3) & (mask[:,:,:] != 16) & (mask[:,:,:] != 17) & (mask[:,:,:] != 18)] = 255

Затем увеличение значений на 1

mask[(mask[:,:,:] == 0) & (mask[:,:,:] == 1) & (mask[:,:,:] == 3) & (mask[:,:,:] == 16) & (mask[:,:,:] == 17) & (mask[:,:,:] == 18)] = mask[:,:,:]+1 #gives me error

Затем изменив 255 на 0

mask[mask[:,:,:] == 255] = 0

Средняя операция выдает ошибку

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Как это сделать эффективно.Желательно за один раз.Не три раза повторять массив.

1 Ответ

0 голосов
/ 24 октября 2018

Используйте np.isin, а затем логическое индексирование для изменения значений следующим образом:

arr = np.arange(0,255)
mask = np.isin(arr,[0,1,3,16,17,18])

arr[mask]+=1
arr[~mask]=0

Или используйте np.where как:

arr = np.where(np.isin(arr,[0,1,3,16,17,18]),arr+1,0)

arr
array([ 1,  2,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17,
       18, 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0])
...