Как эффективно получить матрицу нужной формы в Python? - PullRequest
3 голосов
/ 11 марта 2012

У меня есть четыре массива типа:

X1 = array([[1, 2], [2, 0]])

X2 = array([[3, 1], [2, 2]])

I1 = array([[1], [1]])

I2 = array([[1], [1]])

И я делаю:

Y = array([I1, X1],
          [I2, X2]])

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

Y = array([[ 1,  1,  2],
           [ 1,  2,  0],
           [-1, -3, -1],
           [-1, -2, -2]])

Как и в этом примере, у меня есть большие матрицы, где X1 и X2 - это n x d матрицы.

Есть ли эффективный способ в Python, с помощью которого я могу получить матрицу Y?

Хотя я знаю об итеративном способе, я ищу эффективный способ для достижения вышеупомянутого.

Здесь Y - матрица n x (d+1), а I1 и I2 - единичные матрицы измерения n x 1.

Ответы [ 3 ]

3 голосов
/ 11 марта 2012

Как насчет следующего:

In [1]: import numpy as np

In [2]: X1 = np.array([[1,2],[2,0]])

In [3]: X2 = np.array([[3,1],[2,2]])

In [4]: I1 = np.array([[1],[1]])

In [5]: I2 = np.array([[4],[4]])

In [7]: Y = np.vstack((np.hstack((I1,X1)),np.hstack((I2,X2))))

In [8]: Y
Out[8]: 
array([[1, 1, 2],
       [1, 2, 0],
       [4, 3, 1],
       [4, 2, 2]])

В качестве альтернативы вы можете создать пустой массив соответствующего размера и заполнить его, используя соответствующие кусочки.Это позволит избежать создания промежуточных массивов.

2 голосов
/ 11 марта 2012

Вам нужно numpy.bmat

In [4]: A = np.mat('1 ; 1 ')
In [5]: B = np.mat('2 2; 2 2')
In [6]: C = np.mat('3 ; 5')
In [7]: D = np.mat('7 8; 9 0')
In [8]: np.bmat([[A,B],[C,D]])
Out[8]: 
matrix([[1, 2, 2],
        [1, 2, 2],
        [3, 7, 8],
        [5, 9, 0]])
0 голосов
/ 11 марта 2012

Для numpy array, эта страница предполагает, что синтаксис может иметь форму

vstack([hstack([a,b]),
        hstack([c,d])])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...