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

Мне нужно было создать изображение из массива.Каждый пиксель должен получить значение r, g, b, alpha на основе целого числа в массиве.С этой целью я написал следующий фрагмент кода:

let r будет массивом с целыми числами в диапазоне от -2 до 0

print(r)
array([[-1, -1, -1, ...,  0,  0,  0],
   [-1, -1, -1, ...,  0,  0,  0],
   [-1, -1, -1, ...,  0,  0,  0],
   ...,
   [ 0,  0,  0, ...,  0,  0,  0],
   [ 0,  0,  0, ...,  0,  0,  0],
   [ 0,  0,  0, ...,  0,  0,  0]], dtype=int32)

colors - это словарь, кодирующий r, g, b, альфа-значения

print(colors) 
{-2: ['0', '0', '0', '0'],
-1: ['1', '1', '1', '0.5'],
0: ['0', '0', '0', '0.5']}

, чтобы получить изображение размеров a.shape [0], a.shape [1], 4 Я делаю следующее

    r = r.astype('int32')
    im = r.reshape(r.shape[0]*r.shape[1])
    im = [ colors[j]  for j in im ]
    im = np.reshape(im, (r.shape[0], r.shape[1], 4))
    im = im.astype('float64')
    toimage(im, cmin = 0, cmax = 1 ).save(dir_to + '/' + 'label' + '/' + str(zoom) + '/' + str(x) + '/' + str(y) + '.png')

Этот код работает нормально, но имеет для изображения только 256 на 256 уже время выполнения более 0,2 секунд.У кого-нибудь есть какие-нибудь предложения, как это оптимизировать?

К сожалению, массивные массивы не позволяют мне транслировать массив в запись.

Ответы [ 2 ]

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

Вот один из способов -

v = np.array(list(colors.values()), dtype=float)
k = np.array(list(colors.keys()), dtype=int)

sidx = k.argsort()
out = v[sidx[k.searchsorted(r,sorter=sidx)]]

Для этого конкретного словаря, r, который отсортирован в порядке убывания и находится в диапазоне от -2 до 0, мы можем избежать searchsorted, заменив таким образомпоследние два (на самом деле также пропускают получение k) шагов с чем-то вроде этого -

out = v[-r]

Для многих повторяющихся индексов для индексирования использование np.take может быть лучше с точки зрения производительности,Например, для данного образца -

In [195]: r = np.random.randint(-2,1,(400,500))

In [196]: %timeit v[-r]
100 loops, best of 3: 3.06 ms per loop

In [197]: %timeit np.take(v,-r,axis=0)
1000 loops, best of 3: 1.45 ms per loop
0 голосов
/ 22 октября 2018

Это выполняется намного быстрее, но все еще несколько косвенно ...

    r = r.astype('int32')
    im = np.zeros((256,256,4))
    for i in [0,1,2,3]:
        for key in colors.keys():
            im[r == key,i] = colors[key][i]

    im = im.astype('float64')
     toimage(im, cmin = 0, cmax = 1 ).save(dir_to + '/' + 'label' + '/' + str(zoom) + '/' + str(x) + '/' + str(y) + '.png')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...