Как свернуть две оси массива вместе из массива? - PullRequest
1 голос
/ 06 апреля 2019

Основная идея: у меня есть массив изображений images=np.array([10, 28, 28, 3]).Итак, 10 изображений 28х28 пикселей с 3 цветными каналами.Я хочу соединить их в одну длинную строку: single_image.shape # [280, 28, 3].Какова была бы лучшая функция на основе numpy для этого?

В более общем смысле: есть ли функция вдоль линий stitch(array, source_axis=0, target_axis=1), которая преобразует массив A.shape # [a0, a1, source_axis, a4, target_axis, a6] в форму B.shape # [a0, a1, a4, target_axis*source_axis, a6] путем объединения подмассивов A[:,:,i,:,:,:] вдоль axis=target_axis

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Вы можете настроить его с помощью одного moveaxis + reshape комбо -

def merge_axis(array, source_axis=0, target_axis=1):
    shp = a.shape
    L = shp[source_axis]*shp[target_axis] # merged axis len
    out_shp = np.insert(np.delete(shp,(source_axis,target_axis)),target_axis-1,L)
    return np.moveaxis(a,source_axis,target_axis-1).reshape(out_shp)

В качестве альтернативы, out_shp может быть настроен с манипуляциями с массивами и может быть легче следовать, например, так -

shp = np.array(a.shape)
shp[target_axis] *= shp[source_axis]
out_shp = np.delete(shp,source_axis)

Если оси source и target являются смежными, мы можем пропустить moveaxis и просто изменить их форму, и дополнительным преимуществом будет то, что выходные данные будут отображать входные данные и, следовательно, фактическибесплатно во время выполнения.Итак, мы введем условие If для проверки и изменения наших реализаций примерно так:

def merge_axis_v1(array, source_axis=0, target_axis=1):
    shp = a.shape
    L = shp[source_axis]*shp[target_axis] # merged_axis_len
    out_shp = np.insert(np.delete(shp,(source_axis,target_axis)),target_axis-1,L)
    if target_axis==source_axis+1:
        return a.reshape(out_shp)
    else:
        return np.moveaxis(a,source_axis,target_axis-1).reshape(out_shp)

def merge_axis_v2(array, source_axis=0, target_axis=1):
    shp = np.array(a.shape)
    shp[target_axis] *= shp[source_axis]
    out_shp = np.delete(shp,source_axis)
    if target_axis==source_axis+1:
        return a.reshape(out_shp)
    else:
        return np.moveaxis(a,source_axis,target_axis-1).reshape(out_shp)

Verify views -

In [156]: a = np.random.rand(10,10,10,10,10)

In [157]: np.shares_memory(merge_axis_v1(a, source_axis=0, target_axis=1),a)
Out[157]: True
1 голос
/ 06 апреля 2019

Вот мой дубль:

def merge_axis(array, source_axis=0, target_axis=1):
    array = np.moveaxis(array, source_axis, 0)
    array = np.moveaxis(array, target_axis, 1)
    array = np.concatenate(array)
    array = np.moveaxis(array, 0, target_axis-1)
    return array
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...