Python numpy在多维数据上沿_轴应用_计算

Python numpy在多维数据上沿_轴应用_计算,python,numpy,apply,j,Python,Numpy,Apply,J,我正在将一个J语言代码翻译成Python,但是Python的apply函数的方式对我来说似乎不太清楚 我现在有一个(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]],

我正在将一个J语言代码翻译成Python,但是Python的apply函数的方式对我来说似乎不太清楚

我现在有一个(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 
这意味着“将A中的每个矩阵(“2”)除以B中的每一行(“1”)

或者干脆

A % B

如果尾随尺寸匹配或为一,则广播工作!所以我们基本上可以添加一个虚拟维度

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.        ]]])

嗯,这意味着我需要每周一次重塑输入矩阵time@KevinChoi看我更新的答案,改变了方法。谢谢你,潘卡吉!似乎我需要重塑输入数据,以便在python中进行复杂的矩阵计算。重塑很便宜。请阅读
numpy
广播规则。一旦理解了使用
np.newaxis
这种方法,它将成为第二天性。
np.apply\u沿轴
是一种迭代一个数组中除了一个轴以外的所有轴的方法。该错误意味着它将
a
B
的1d子数组传递给
np.divide
。我认为它不是很有用,从这些问题来看,它们经常被误用。你确定这就是你所谓的“沿轴应用”吗?10号尺寸是从哪里来的?当我复制粘贴你的代码时,我得到一个
(3,3,3,2)
成形的结果。那是不对的,但也不是你的错。