Добавление 2x2 матриц с дисперсией в numpy - PullRequest
0 голосов
/ 28 января 2019

У меня есть пустой массив, такой как:

gmm.sigma =

[[[ 4.64 -1.93]
  [-1.93  6.5 ]]
 [[ 3.65  2.89]
  [ 2.89 -1.26]]]

, и я хочу добавить еще одну матрицу 2x2, такую ​​как:

gauss.sigma=

[[ -1.24  2.34]
 [  2.34  4.76]]

чтобы получить:

gmm.sigma =

[[[ 4.64 -1.93]
  [-1.93  6.5 ]]
 [[ 3.65  2.89]
  [ 2.89 -1.26]]
 [[-1.24  2.34]
  [ 2.34  4.76]]]

Я пытался: gmm.sigma = np.append(gmm.sigma, gauss.sigma, axis = 0), но получаю эту ошибку:

Traceback (most recent call last):
  File "test1.py", line 40, in <module>
    gmm.sigma = np.append(gmm.sigma, gauss.sigma, axis = 0)
  File "/home/rowan/anaconda2/lib/python2.7/site-packages/numpy/lib/function_base.py", line 4528, in append
    return concatenate((arr, values), axis=axis)
ValueError: all the input arrays must have same number of dimensions

Любая помощь приветствуется

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Похоже, что вы хотите объединить 2 массива на первой оси - за исключением того, что вторая - только 2d.Требуется дополнительное измерение:

In [233]: arr = np.arange(8).reshape(2,2,2)
In [234]: arr1 = np.arange(10,14).reshape(2,2)
In [235]: np.concatenate((arr, arr1[None,:,:]), axis=0)
Out[235]: 
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[10, 11],
        [12, 13]]])

dstack - это вариант concatenate, который расширяет все до 3d и соединяет последнюю ось.Чтобы использовать его, мы должны транспонировать все:

In [236]: np.dstack((arr.T,arr1.T)).T
Out[236]: 
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[10, 11],
        [12, 13]]])

index_tricks добавляет некоторые классы, которые играют похожие трюки с измерениями:

In [241]: np.r_['0,3', arr, arr1]
Out[241]: 
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[10, 11],
        [12, 13]]])

Документы np.r_ требуют некоторого чтения, еслиВы хотите извлечь из этого максимум, но его стоит использовать, если вам нужно настроить размеры нескольких массивов, например.np.r_['0,3', arr1, arr, arr1]

0 голосов
/ 28 января 2019

Как указано в сообщении об ошибке, размеры gmm и gauss_sigma не совпадают, перед добавлением необходимо изменить форму gauss_sigma.

gmm_sigma = np.array([[[4.64, -1.93], [-1.93, 6.5]], [[3.65, 2.89], [ 2.89, -1.26]]])
gauss_sigma = np.array([[-1.24, 2.34], [2.34, 4.76]])

print(np.append(gmm_sigma, gauss_sigma.reshape(1, 2, 2), axis=0))
# array([[[ 4.64, -1.93],
#         [-1.93,  6.5 ]],
# 
#        [[ 3.65,  2.89],
#         [ 2.89, -1.26]],
# 
#        [[-1.24,  2.34],
#         [ 2.34,  4.76]]])
0 голосов
/ 28 января 2019

Вы можете использовать dstack, который суммирует массивы в последовательности по глубине (вдоль третьей оси) с последующей транспонированием.Чтобы получить желаемый результат, вам нужно будет сложить gmm.T и gauss

gmm = np.array([[[4.64, -1.93],
                [-1.93, 6.5 ]],
                [[3.65, 2.89],
                 [2.89, -1.26]]])

gauss = np.array([[ -1.24, 2.34],
                  [2.34, 4.76]])


result = np.dstack((gmm.T, gauss)).T
print (result)
print (result.shape)
# (3, 2, 2)

Выход

array([[[ 4.64, -1.93],
    [-1.93,  6.5 ]],

   [[ 3.65,  2.89],
    [ 2.89, -1.26]],

   [[-1.24,  2.34],
    [ 2.34,  4.76]]])

В качестве альтернативы вы также можете использовать сцепление, правильно изменив форму второго массива как

gmm = np.array([[[4.64, -1.93],
                [-1.93, 6.5 ]],
                [[3.65, 2.89],
                 [2.89, -1.26]]])

gauss = np.array([[ -1.24, 2.34],
                  [2.34, 4.76]]).reshape(1,2,2)

result = np.concatenate((gmm, gauss), axis=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...