Операция Repmat в python - PullRequest
       5

Операция Repmat в python

0 голосов
/ 28 апреля 2020

Я хочу вычислить среднее значение трехмерного массива вдоль двух осей и вычесть это среднее значение из массива. В Matlab я использую функцию repmat, чтобы добиться этого следующим образом

% A is an array of size 100x50x100
mean_A = mean(mean(A,3),1);                % mean_A is 1D of length 50
Am = repmat(mean_A,[100,1,100])            % Am is 3D 100x50x100
flc_A = A - Am                             % flc_A is 3D 100x50x100

Теперь я пытаюсь сделать то же самое с python.

mean_A = numpy.mean(numpy.mean(A,axis=2),axis=0);

дает мне 1D массив. Однако я не могу найти способ скопировать это, чтобы сформировать трехмерный массив, используя numpy.tile(). Я что-то упустил или есть другой способ сделать это в python?

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Вы можете установить keepdims на True в обоих случаях, чтобы результирующая фигура транслировалась и использовать np.broadcast_to для трансляции в форму A:

np.broadcast_to(np.mean(np.mean(A,2,keepdims=True),axis=0,keepdims=True), A.shape) 

Обратите внимание, что вы также можете указать кортеж осей, по которому следует брать последовательные средства:

np.broadcast_to(np.mean(A,axis=tuple([2,0]), keepdims=True), A.shape)
0 голосов
/ 28 апреля 2020

numpy .tile не совпадает с Matlab repmat. Вы могли бы обратиться к этот вопрос . Тем не менее, есть простой способ повторить работу, которую вы проделали в Matlab. И вам не обязательно понимать, как numpy .tile работает в Python.

import numpy as np
A = np.random.rand(100, 50, 100)
# keep the dims of the array when calculating mean values
B = np.mean(A, axis=2, keepdims=True)
C = np.mean(B, axis=0, keepdims=True) # now the shape of C is (1, 50, 1)
# then simply duplicate C in the first and the third dimensions
D = np.repeat(C, 100, axis=0) 
D = np.repeat(D, 100, axis=2)

D - это нужный вам 3D-массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...