Расширение каждого элемента в матрице (2 на 2) до блока (3 на 2)

matlab python-3.x numpy matrix

125 просмотра

2 ответа

Я хочу расширить каждый элемент в матрице (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 теперь был блоком 3 на 2 в Y. Положение блока в 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)); 

Я ценю вашу помощь. Заранее спасибо.

Автор: aura Источник Размещён: 08.11.2019 11:01

Ответы (2)


3 плюса

Решение

Если у вас все в порядке с NumPy modulePython, вы можете использовать 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
Автор: Divakar Размещён: 20.08.2016 07:37

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]])
Автор: Eric Размещён: 20.08.2016 07:15
Вопросы из категории :
32x32