【问题标题】:numpy apply_along_axis computation on multidimensional datanumpy apply_along_axis 对多维数据的计算
【发布时间】:2019-05-12 02:36:26
【问题描述】:

我正在将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) 

有什么建议吗? 提前谢谢你=]

ps。 J代码是

A %"2 1 B 

这意味着“将 A 中的每个矩阵(“2)”除以 B 中的每一行(“1)”

或者只是简单的

A % B

【问题讨论】:

  • np.apply_along_axis 是一种遍历 one 数组的除一个轴以外的所有轴的方法。该错误意味着它将A 和所有B 的一维子数组传递给np.divide。我认为它不是很有用,而且从 SO 问题来看,经常被误用。
  • 你确定这是你称呼apply_along_axis的方式吗?尺寸 10 尺寸从何而来?当我复制粘贴您的代码时,我得到一个(3, 3, 3, 2) 形状的结果。这是不对的,但这也不是你的错误。

标签: python numpy apply j


【解决方案1】:

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

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

【讨论】:

  • hmmm 这意味着我每次都需要重塑输入矩阵
  • @KevinChoi 看到我更新的答案,改变了方法。
  • 谢谢你,Pankaj!似乎我需要重塑输入数据以在 python 中进行复杂的矩阵计算
  • 整形很便宜。阅读numpy 广播规则。一旦理解像这样使用np.newaxis 将成为第二天性。
猜你喜欢
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多