MATLAB Numpy поэлементное умножение

Глагол rowwise() делает так, чтобы каждая команда выполнялась отдельно в каждой строке. Это не то, что вы хотите, потому что хотите нормализовать все значения в группе. Не один ряд. Просто возьмите эту часть.

x <- RaRb %>% 
  group_by(symbol) %>%
  select(symbol, adjusted.x) %>%
  mutate(adj.x = normalise_series(adjusted.x))
0
задан Andras Deak 18 January 2019 в 20:50
поделиться

2 ответа

Вы были близки. Вы можете сделать это, умножив транспонирование матриц и затем транспонировав окончательные субматрицы, используя свопаксы

A = np.array([[1,2,3],[4,5,6],[7,8,9]])
C = np.array([[[100, 1], [10, 0.1], [1, 0.01]]]) # C.shape is (1, 3, 2)

D = (A.T*C.T)
D = D.swapaxes(1,2)

Вы также можете объединить эти строки как

D = (A.T*C.T).swapaxes(1,2)

[116 ] Вывод

array([[[1.e+02, 2.e+01, 3.e+00],
    [4.e+02, 5.e+01, 6.e+00],
    [7.e+02, 8.e+01, 9.e+00]],

   [[1.e+00, 2.e-01, 3.e-02],
    [4.e+00, 5.e-01, 6.e-02],
    [7.e+00, 8.e-01, 9.e-02]]])
0
ответ дан Sheldore 18 January 2019 в 20:50
поделиться

Вы добавили транспонирование в C, которого нет в коде MATLAB.

Если вы хотите сохранить точно такой же макет данных, вставьте конечный одноэлементный размер в A. В MATLAB конечные синглтоны неявны, в numpy ведущие синглтоны неявны:

>>> D = A[...,None] * C.squeeze()

>>> D
array([[[1.e+02, 1.e+00],
        [2.e+01, 2.e-01],
        [3.e+00, 3.e-02]],

       [[4.e+02, 4.e+00],
        [5.e+01, 5.e-01],
        [6.e+00, 6.e-02]],

       [[7.e+02, 7.e+00],
        [8.e+01, 8.e-01],
        [9.e+00, 9.e-02]]])

Здесь A[..., None] имеет форму (3, 3, 1), а C.squeeze() просто отменяет что лишнее ведущее одноэлементное измерение и формирует его (3,2). Они транслируются в форму (3, 3, 2). MATLAB и numpy по-разному интерпретируют многомерные массивы, что объясняет, почему repr выше соответствует трем массивам формы (3,2), в то время как MATLAB показывает два массива формы (3,3). Но на самом деле это тот же массив:

>>> D[..., 0]
array([[100.,  20.,   3.],
       [400.,  50.,   6.],
       [700.,  80.,   9.]])

>>> D[..., 1]
array([[1.  , 0.2 , 0.03],
       [4.  , 0.5 , 0.06],
       [7.  , 0.8 , 0.09]])

Обратите внимание, что если вы сохраните порядок MATLAB в своем коде numpy, вы можете захотеть использовать разметку fortran в своих массивах, иначе у вас будут «быстрые» оси в неоптимальных места в коде NumPy.

0
ответ дан Andras Deak 18 January 2019 в 20:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: