Поэлементная конкатенация в numpy - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь объединить 2 массива поэлементно.У меня есть конкатенация, работающая для получения правильной формы, но она не была применена поэлементно.

Итак, у меня есть этот массив

[0, 1]
[2, 3]
[4, 5]

Я хочу добавить каждый элемент в массиве с каждым элементом.целевой результат будет

[0, 1, 0, 1]
[0, 1, 2, 3]
[0, 1, 4, 5]
[2, 3, 0, 1]
[2, 3, 2, 3]
[2, 3, 4, 5]
[4, 5, 0, 1]
[4, 5, 2, 3]
[4, 5, 4, 5] 

Я думаю, мне может понадобиться изменить ось, но тогда я не смогу заставить вещание работать.

любая помощь будет принята с благодарностью.многому научиться у numy!

a = np.arange(6).reshape(3, 2))
b = np.concatenate((a, a), axis=1)

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Один способ будет складывать реплицированные версии, созданные с np.repeat и np.tile -

In [52]: n = len(a)

In [53]: np.hstack((np.repeat(a,n,axis=0),np.tile(a,(n,1))))
Out[53]: 
array([[0, 1, 0, 1],
       [0, 1, 2, 3],
       [0, 1, 4, 5],
       [2, 3, 0, 1],
       [2, 3, 2, 3],
       [2, 3, 4, 5],
       [4, 5, 0, 1],
       [4, 5, 2, 3],
       [4, 5, 4, 5]])

Другой будет с broadcasted-assignment, так как вы упомянули broadcasting -

def create_mesh(a):
    m,n = a.shape
    out = np.empty((m,m,2*n),dtype=a.dtype)
    out[...,:n] = a[:,None]
    out[...,n:] = a
    return out.reshape(-1,2*n)
1 голос
/ 22 мая 2019

Одно из решений состоит в том, чтобы использовать cartesian_product отправителя, чтобы расширить его до двумерных массивов.Вот как я обычно это делаю:

# Your input array.
arr    
# array([[0, 1],
#        [2, 3],
#        [4, 5]])

idxs = cartesian_product(*[np.arange(len(arr))] * 2)
arr[idxs].reshape(idxs.shape[0], -1)    
# array([[0, 1, 0, 1],
#        [0, 1, 2, 3],
#        [0, 1, 4, 5],
#        [2, 3, 0, 1],
#        [2, 3, 2, 3],
#        [2, 3, 4, 5],
#        [4, 5, 0, 1],
#        [4, 5, 2, 3],
#        [4, 5, 4, 5]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...