在numpy中附加2x2协方差矩阵

2024-10-19 16:22:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个numpy数组,例如:

你知道吗gmm.sigma公司=

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

我想添加另一个2x2矩阵,例如:

你知道吗高斯西格玛=你知道吗

[[ -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

感谢您的帮助


Tags: inpynumpylibnpline公司矩阵
3条回答

看起来您希望在第一个轴上连接两个数组-但第二个轴仅为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]]])

dstackconcatenate的变体,它将所有内容扩展到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],那么它可能值得使用

如错误消息所述,gmmgauss_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]]])

您可以使用^{}将数组按深度顺序(沿第三个轴)堆叠,然后进行转置。要获得所需的输出,必须对gmm.Tgauss进行堆栈

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]]])

或者您也可以使用concatenate,将第二个数组正确地重新格式化为

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)

相关问题 更多 >