Chr*_*ris 10 python numpy padding
有没有一个功能正在做什么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')
Run Code Online (Sandbox Code Playgroud)
错误: ValueError: ((-1, 1), (1, 1), (1, 1)) cannot contain negative values.
我理解这个函数numpy.pad()不带负值,但是有没有numpy.unpad()类似的东西?
unu*_*tbu 11
正如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]]])
Run Code Online (Sandbox Code Playgroud)
您要的操作:
C = np.pad(B, ((-1,1),(1,1),(1,1)), mode='constant')
Run Code Online (Sandbox Code Playgroud)
可以用pad和常规切片的组合代替:
C = np.pad(B, ((0,1),(1,1),(1,1)), mode='constant')[1:,...]
Run Code Online (Sandbox Code Playgroud)
通用的解决方案是这样的:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6615 次 |
| 最近记录: |