numpy apply_along_axis вычисление на многомерных данных - PullRequest
2 голосов
/ 12 мая 2019

Я перевожу код языка J на ​​Python, но способ применения функции Python кажется мне немного неясным ...

В настоящее время у меня есть (3, 3, 2) матрица A и(3, 3) матрица B.

Я хочу разделить каждую матрицу в A на строки в B:

A = np.arange(1,19).reshape(3,3,2)
array([[[ 1,  2],
        [ 3,  4],
        [ 5,  6]],

       [[ 7,  8],
        [ 9, 10],
        [11, 12]],

       [[13, 14],
        [15, 16],
        [17, 18]]])
B = np.arange(1,10).reshape(3,3)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

То есть результат будет выглядеть как

      1 2
    1.5 2
1.66667 2

   1.75 2
    1.8 2
1.83333 2

1.85714 2
  1.875 2
1.88889 2

для первой матрицы результата, способ, которым я хочу вычислить, следующий:

 1/1  2/1
 3/2  4/2
 5/3  6/3

Я пытался

np.apply_along_axis(np.divide,1,A,B)

, но он говорит

operands could not be broadcast together with shapes (10,) (10,10,2) 

Любой совет?Заранее спасибо =]

пс.J-код:

A %"2 1 B 

Это означает «делить каждую матрицу (» 2) из ​​A на каждую строку («1) из B»

или просто

A % B

1 Ответ

2 голосов
/ 12 мая 2019

Вещание работает, если конечные измерения совпадают или равны единице!Таким образом, мы можем добавить фиктивное измерение!

import numpy as np
A = np.arange(1,19).reshape(3,3,2)
B = np.arange(1,10).reshape(3,3)
B = B[...,np.newaxis] # This adds new dummy dimension in the end, B's new shape is (3,3,1)
A/B

array([[[1.        , 2.        ],
        [1.5       , 2.        ],
        [1.66666667, 2.        ]],

    [[1.75      , 2.        ],
        [1.8       , 2.        ],
        [1.83333333, 2.        ]],

    [[1.85714286, 2.        ],
        [1.875     , 2.        ],
        [1.88888889, 2.        ]]])
...