像在MATLAB中一样在Python中连接矩阵/向量?

时间:2018-02-04 03:24:11

标签: python matlab numpy concatenation linear-algebra

Axyz成为适当大小的某些向量或矩阵。然后在MATLAB中,可以构建一个超级矩阵" B很容易就出现了:

A = [1 2;3 4];
x = [4;5];
y = [1 2];
z = 4;
B = [A x;y z];

输出结果为:

>> B

B =

     1     2     4
     3     4     5
     1     2     4

在NumPy中实现相同效果的最佳方法是什么?

3 个答案:

答案 0 :(得分:4)

您可以使用numpy.block

In [27]: a
Out[27]: 
array([[1, 2],
       [3, 4]])

In [28]: x
Out[28]: 
array([[4],
       [5]])

In [29]: y
Out[29]: array([1, 2])

In [30]: z
Out[30]: 4

In [31]: np.block([[a, x], [y, z]])
Out[31]: 
array([[1, 2, 4],
       [3, 4, 5],
       [1, 2, 4]])

答案 1 :(得分:2)

您可以使用concatenate function来实现此目的。从官方文档中,您可以看到一个非常不言自明的例子:

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])

np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])

np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
       [3, 4, 6]])

答案 2 :(得分:1)

MATLAB表示法的最直接副本是:

                0 -> N-1
        j before n/2 after (n-j)

               1 -> N-1
   (j-1) before [(n/2)+1] after n-j+1

               2 -> N-1
   (j-2) before [(n/2)+2] after n-j+2

               and so on

像这样的字符串输入for i in range(0, n): for j in range(i,n): if j < n/2+i: s_rt = j-i else : s_rt = n-j+i 必须在工作区中查找相应的变量,依此类推。它有像MATLAB一样的感觉,但是很尴尬的Python。请注意,In [166]: A = np.matrix('1 2;3 4') ...: x = np.matrix('4;5') ...: y = np.matrix('1 2') ...: z = np.matrix('4') ...: In [167]: A Out[167]: matrix([[1, 2], [3, 4]]) In [168]: x Out[168]: matrix([[4], [5]]) In [169]: y Out[169]: matrix([[1, 2]]) In [170]: z Out[170]: matrix([[4]]) In [171]: np.bmat('A x; y z') Out[171]: matrix([[1, 2, 4], [3, 4, 5], [1, 2, 4]]) 始终为2d,就像原始MATLAB一样。

使用更传统的嵌套列表输入:

bmat

np.matrix也适用于In [173]: np.block([[A,x],[y,z]]) Out[173]: matrix([[1, 2, 4], [3, 4, 5], [1, 2, 4]]) 个对象:

block

使用适当的Python / numpy语法:

np.array

内部In [174]: np.block([[A.A,x.A],[y.A,z.A]]) Out[174]: array([[1, 2, 4], [3, 4, 5], [1, 2, 4]]) 使用In [181]: Aa = np.array([[1, 2],[3, 4]]) ...: xa = np.array([[4],[5]]) ...: ya = np.array([1, 2]) ...: za = np.array([4]) In [187]: np.block([[Aa, xa],[ya, za]]) Out[187]: array([[1, 2, 4], [3, 4, 5], [1, 2, 4]]) 。我认为以前使用blockconcatenate,现在它以递归的方式运行。

hstack

@Mad询问了vstackIn [190]: np.vstack([np.hstack([Aa, xa]),np.hstack([ya, za])]) Out[190]: array([[1, 2, 4], [3, 4, 5], [1, 2, 4]]) 。这些是使用[]语法的r_系列的版本(因为它们实际上是具有c_方法的类对象)。对于2d矩阵输入,这是有效的(并且相对漂亮):

concatenate

getitem也有效。

对于混合了2d和1d的数组,我必须使用:

In [214]: np.r_[np.c_[A, x], np.c_[y, z]]
Out[214]: 
matrix([[1, 2, 4],
        [3, 4, 5],
        [1, 2, 4]])

字符串&#39; 2&#39;告诉它在连接之前将元素扩展到2d。我没有太多地使用那个字符串参数,并且在我做对之前必须进行实验。

最后一个表达式是:

np.r_[np.c_[A.A, x.A], np.c_[y.A, z.A]]

虽然我在这,但另一个版本:

np.r_[np.r_['1,2', Aa, xa], np.r_['1,2', ya, za]]

np.concatenate([np.concatenate([Aa, xa], axis=1), np.concatenate([ya[None,:], za[None,:]], axis=1)], axis=0) np.r_['0,2', np.c_[Aa, xa], np.r_[ya, za]] hstackvstack可以做的事情可以通过r_和一些维度调整同样快速完成。