【问题标题】:Is there an opposite / inverse to numpy.pad() function?numpy.pad() 函数是否有相反/反向的功能?
【发布时间】:2014-09-08 11:31:35
【问题描述】:

是否有与numpy.pad() 的功能相反的功能?

我正在寻找的是一个函数来(统一)减少每个方向上的 numpy 数组(矩阵)的维度。我试图用负值调用numpy.pad(),但它给出了一个错误:

import numpy as np

A_flat = np.array([0,1,2,3,4,5,6,7,8,9,10,11])
A = np.reshape(A_flat, (3,2,-1))

#this WORKS:
B = np.pad(A, ((1,1),(1,1),(1,1)), mode='constant')

# this DOES NOT WORK:
C = np.pad(B, ((-1,1),(1,1),(1,1)), mode='constant')

错误:ValueError: ((-1, 1), (1, 1), (1, 1)) cannot contain negative values.

我知道numpy.pad()这个函数不接受负值,但是有numpy.unpad()或类似的东西吗?

【问题讨论】:

  • 你的意思是要裁剪你的数组,选择一些子数组?我建议你使用普通的切片符号来做到这一点。
  • 谢谢,是的——你说得对。

标签: python numpy padding


【解决方案1】:

正如 mdurant 建议的那样,只需使用切片索引:

In [59]: B[1:-1, 1:-1, 1:-1]
Out[59]: 
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]]])

【讨论】:

  • 这适用于我只想进行裁剪 - Roman 建议的组合方法更接近我所寻找的 - 尽管它几乎是一样的,当然。
【解决方案2】:

你想要的操作:

C = np.pad(B, ((-1,1),(1,1),(1,1)), mode='constant')

可以替换为pad和通用切片的组合:

C = np.pad(B, ((0,1),(1,1),(1,1)), mode='constant')[1:,...]

【讨论】:

  • 有趣的方法,我想我必须先检查负输入,然后将正部分放入该填充函数中,将负裁剪值放入切片符号中。
  • 如果要对轴索引上的函数进行参数化怎么办?
【解决方案3】:

一般的解决办法是这样的:

def unpad(x, pad_width):
    slices = []
    for c in pad_width:
        e = None if c[1] == 0 else -c[1]
        slices.append(slice(c[0], e))
    return x[tuple(slices)]

# Test
import numpy as np
pad_width = ((0, 0), (1, 0), (3, 4))

a = np.random.rand(10, 10, 10)
b = np.pad(a, pad_width, mode='constant')
c = unpad(b, pad_width)
np.testing.assert_allclose(a, c)

【讨论】:

    【解决方案4】:

    这是一个居中取消填充的函数:

    def unpad(dens, pad):
        """
        Input:  dens   -- np.ndarray(shape=(nx,ny,nz))
                pad    -- np.array(px,py,pz)
    
        Output: pdens -- np.ndarray(shape=(nx-px,ny-py,nz-pz))
        """
    
        nx, ny, nz = dens.shape
        pl = pad // 2
        pr = pad - pl
    
        pdens = dens[pl[0]:nx-pr[0],
                pl[1]:ny-pr[1],
                pl[2]:nz-pr[2]]
    
        return pdens
    

    【讨论】:

      【解决方案5】:
      def reverse_pad(arr: np.ndarray, padding: tuple):
      """Reverses padding for some numpy array
      
      Args:
          arr (np.ndarray): Input numpy array
          padding (tuple): Padding used to padd array
      
      Returns:
          np.ndarray: Numpy array with reversed padding
      """
      
      reversed_padding = [
          slice(start_pad, dim - end_pad)  # dim tracks dimension length
          for ((start_pad, end_pad), dim) in zip(padding, arr.shape)
      ]
      
      return arr[reversed_padding]
      

      如果你用一些填充来填充数组,如下所示:

      arr = np.pad(arr, some_padding, mode="constant")

      您可以使用以下命令反转此操作:

      arr = reverse_pad(arr, some_padding)

      如果可行,请告诉我!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-11
        • 1970-01-01
        • 2016-10-15
        • 1970-01-01
        • 1970-01-01
        • 2017-04-10
        • 2023-03-17
        • 2012-09-19
        相关资源
        最近更新 更多