像在 MATLAB 中一样在 Python 中连接 matrices/vectors?
Concatenate matrices/vectors in Python like in MATLAB?
令A
、x
、y
和z
为一些适当大小的向量或矩阵。然后在 MATLAB 中可以很容易地从中构建一个 "super matrix" 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 中实现相同效果的最佳方法是什么?
您可以使用 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]])
最直接的 MATLAB 符号副本是:
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]])
像这样的字符串输入bmat
必须在工作区中查找相应的变量,等等。它有类似 MATLAB 的感觉,但是很笨拙 Python。请注意,np.matrix
始终是 2d,就像原始 MATLAB 一样。
使用更传统的嵌套列表输入:
In [173]: np.block([[A,x],[y,z]])
Out[173]:
matrix([[1, 2, 4],
[3, 4, 5],
[1, 2, 4]])
block
也适用于 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]])
使用正确的 Python/numpy 语法:
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]])
内部 block
使用 concatenate
。我认为它曾经使用 hstack
和 vstack
,现在它递归地工作。
In [190]: np.vstack([np.hstack([Aa, xa]),np.hstack([ya, za])])
Out[190]:
array([[1, 2, 4],
[3, 4, 5],
[1, 2, 4]])
@Mad 询问了 r_
和 c_
。这些是使用 [] 语法的 concatenate
系列的版本(因为它们实际上是具有 getitem
方法的 class 对象)。对于 2d 矩阵输入,这有效(并且相对漂亮):
In [214]: np.r_[np.c_[A, x], np.c_[y, z]]
Out[214]:
matrix([[1, 2, 4],
[3, 4, 5],
[1, 2, 4]])
np.r_[np.c_[A.A, x.A], np.c_[y.A, z.A]]
也有效。
对于混合了 2d 和 1d 的数组,我必须使用:
np.r_[np.r_['1,2', Aa, xa], np.r_['1,2', ya, za]]
字符串“2”告诉它在连接之前将元素扩展为 2d。我没怎么用过那个字符串参数,在我做对之前不得不做实验。
最后一个表达式正在做:
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]]
hstack
、vstack
、r_
和 c_
可以做的所有事情都可以用 concatenate
和一些尺寸调整同样快速地完成。
您可以使用 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]])
令A
、x
、y
和z
为一些适当大小的向量或矩阵。然后在 MATLAB 中可以很容易地从中构建一个 "super matrix" 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 中实现相同效果的最佳方法是什么?
您可以使用 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]])
最直接的 MATLAB 符号副本是:
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]])
像这样的字符串输入bmat
必须在工作区中查找相应的变量,等等。它有类似 MATLAB 的感觉,但是很笨拙 Python。请注意,np.matrix
始终是 2d,就像原始 MATLAB 一样。
使用更传统的嵌套列表输入:
In [173]: np.block([[A,x],[y,z]])
Out[173]:
matrix([[1, 2, 4],
[3, 4, 5],
[1, 2, 4]])
block
也适用于 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]])
使用正确的 Python/numpy 语法:
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]])
内部 block
使用 concatenate
。我认为它曾经使用 hstack
和 vstack
,现在它递归地工作。
In [190]: np.vstack([np.hstack([Aa, xa]),np.hstack([ya, za])])
Out[190]:
array([[1, 2, 4],
[3, 4, 5],
[1, 2, 4]])
@Mad 询问了 r_
和 c_
。这些是使用 [] 语法的 concatenate
系列的版本(因为它们实际上是具有 getitem
方法的 class 对象)。对于 2d 矩阵输入,这有效(并且相对漂亮):
In [214]: np.r_[np.c_[A, x], np.c_[y, z]]
Out[214]:
matrix([[1, 2, 4],
[3, 4, 5],
[1, 2, 4]])
np.r_[np.c_[A.A, x.A], np.c_[y.A, z.A]]
也有效。
对于混合了 2d 和 1d 的数组,我必须使用:
np.r_[np.r_['1,2', Aa, xa], np.r_['1,2', ya, za]]
字符串“2”告诉它在连接之前将元素扩展为 2d。我没怎么用过那个字符串参数,在我做对之前不得不做实验。
最后一个表达式正在做:
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]]
hstack
、vstack
、r_
和 c_
可以做的所有事情都可以用 concatenate
和一些尺寸调整同样快速地完成。
您可以使用 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]])