【问题标题】:Padding a 3-dimensional numpy array with the medians alongside specific axis用特定轴旁边的中值填充 3 维 numpy 数组
【发布时间】:2021-05-19 08:15:48
【问题描述】:

假设我有以下 numpy 数组 arr:

[[[  0   0]
  [  1  10]
  [  2  20]]

 [[  3  30]
  [  4  40]
  [  5  50]]

 [[  6  60]
  [  7  70]
  [  8  80]]

 [[  9  90]
  [ 10 100]
  [ 11 110]]

 [[ 12 120]
  [ 13 130]
  [ 14 140]]]

形状为(5, 3, 2)

现在,请注意 arr 的以下维度:

第一个`arr[:, :, 0]

[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]
 [12 13 14]]

中位数7

和`arr[:, :, 1]

[[  0  10  20]
 [ 30  40  50]
 [ 60  70  80]
 [ 90 100 110]
 [120 130 140]]

中位数为 70

我想用上面的一对中位数(可以计算为np.median(a.reshape(-1, a.shape[-1]), axis=0))填充arr 的第一个轴,这样结果的形状为(k, 3, 2),对于某些k > 5,并且被填充如下所示(例如,k=2 和最终形状 (7, 3, 2)

[[[  0   0]
  [  1  10]
  [  2  20]]

 [[  3  30]
  [  4  40]
  [  5  50]]

 [[  6  60]
  [  7  70]
  [  8  80]]

 [[  9  90]
  [ 10 100]
  [ 11 110]]

 [[ 12 120]
  [ 13 130]
  [ 14 140]]

 [[ 7 70]
  [ 7 70]
  [ 7 70]]

 [[ 7 70]
  [ 7 70]
  [ 7 70]]]

请注意,我不能使用 numpy.padmode='median' 参数,因为它无法计算中位数,只考虑数组的一个轴并展平其他轴(如果我修复某个轴,它将始终计算其他每个轴上的单个中位数)。

问题是,我曾经能够在 numpy 2.16 中以非常简单的方式做到这一点:

md = np.median(a.reshape(-1, a.shape[-1]), axis=0)
arp = np.pad(a, ((0, k), (0, 0), (0, 0)), mode='constant', constant_values=(0, md))

但同样的代码在 numpy 2.19 中中断,出现以下错误:

ValueError: could not broadcast input array from shape (2) into shape (7,3,0)

使用numpy.pad,我尝试了很多输入变化,但没有运气。老实说,这让我发疯,在这一点上,我几乎只是简单地堆叠中位数数组的重复。但我真的很想知道是否可以在 numpy 2.19 中使用 numpy.pad 解决这个问题

【问题讨论】:

    标签: python arrays numpy padding


    【解决方案1】:

    怎么样:

    # (reproducible setup)
    a = np.arange(15).reshape(5,3,1)
    a = np.concatenate((a, a*10), axis=-1)
    
    # median along axes 0,1
    md = np.median(a, axis=(0,1))
    
    # "padding" with that median
    k = 2
    b = np.vstack((a, np.tile(md, (k, a.shape[1], 1))))
    
    >>> b
    array([[[  0.,   0.],
            [  1.,  10.],
            [  2.,  20.]],
    
           [[  3.,  30.],
            [  4.,  40.],
            [  5.,  50.]],
    
           [[  6.,  60.],
            [  7.,  70.],
            [  8.,  80.]],
    
           [[  9.,  90.],
            [ 10., 100.],
            [ 11., 110.]],
    
           [[ 12., 120.],
            [ 13., 130.],
            [ 14., 140.]],
    
           [[  7.,  70.],
            [  7.,  70.],
            [  7.,  70.]],
    
           [[  7.,  70.],
            [  7.,  70.],
            [  7.,  70.]]])
    

    编辑:如果你想使用pad,那么你也可以这样做:

    b = np.pad(
        a.reshape((-1, 2)),
        ((0,k*a.shape[1]), (0,0)),
        mode='median',
    ).reshape(np.add(a.shape, (k,0,0)))
    

    这让您可以使用您正在寻找的mode='median',以一种对pad() 来说很自然的方式。

    【讨论】:

    • 这确实有效,但这并不是我想要的,因为我想知道是否可以在 numpy 2.19 中使用numpy.pad 解决这个问题(因为我实际上解决了它在 numpy 2.16 中)。尽管如此,我还是要投票,因为我错过了这样一个事实,即可以像 md = np.median(a, axis=(0,1)) 一样在轴列表旁边计算中位数,这是非常有趣的信息!
    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2019-11-24
    • 2019-07-05
    • 2011-09-30
    • 2022-01-09
    相关资源
    最近更新 更多