将(2乘2)矩阵中的每个元素扩展为(3乘2)块

时间:2016-08-20 07:33:11

标签: matlab python-3.x numpy matrix

我希望将(2乘2)矩阵中的每个元素扩展为(3乘2)块,使用Python 3 ---使用专业而优雅的代码。由于我不知道python代码,我将在数学中描述以下内容

X =              # X is an 2-by-2 matrix.
     1, 2
     3, 4

d = (3,2)        # d is the shape that each element in X should be expanded to.
Y =              # Y is the result
     1, 1, 2, 2
     1, 1, 2, 2
     1, 1, 2, 2
     3, 3, 4, 4
     3, 3, 4, 4
     3, 3, 4, 4

不是X中的每个元素现在都是Y中的3乘2块.Y中块的位置与X中元素的位置相同。

这是MATLAB代码

X = [1,2;3,4];
d = [3,2]
[row, column] = size(X);
a = num2cell(X);
b = cell(row, column);
[b{:}] = deal(ones(d));

Y = cell2mat(cellfun(@times,a,b,'UniformOutput',false)); 

感谢您的帮助。提前谢谢。

2 个答案:

答案 0 :(得分:3)

如果你可以使用NumPy module和Python,你可以使用numpy.kron -

np.kron(X,np.ones((3,2),dtype=int))

示例运行 -

In [15]: import numpy as np

In [16]: X = np.arange(4).reshape(2,2)+1 # Create input array

In [17]: X
Out[17]: 
array([[1, 2],
       [3, 4]])

In [18]: np.kron(X,np.ones((3,2),dtype=int))
Out[18]: 
array([[1, 1, 2, 2],
       [1, 1, 2, 2],
       [1, 1, 2, 2],
       [3, 3, 4, 4],
       [3, 3, 4, 4],
       [3, 3, 4, 4]])

事实上,这是直接翻译如何以优雅和专业的方式在MATLAB中实现所需的结果,如下所示 -

>> X = [1,2;3 4]
X =
     1     2
     3     4
>> kron(X,ones(3,2))
ans =
     1     1     2     2
     1     1     2     2
     1     1     2     2
     3     3     4     4
     3     3     4     4
     3     3     4     4

答案 1 :(得分:2)

使用ndarray.repeat执行此操作的另一种方法:

>>> X = np.arange(4).reshape(2,2)+1
>>> X.repeat(3, axis=0).repeat(2, axis=1)
array([[1, 1, 2, 2],
       [1, 1, 2, 2],
       [1, 1, 2, 2],
       [3, 3, 4, 4],
       [3, 3, 4, 4],
       [3, 3, 4, 4]])