我试图重新中心一组类似图像的数据,我知道x-和y-维度中的适当偏移。与这个问题类似,我想做一些"滚动"之类的事情,但是我不假设我想填写带有零数组中的"空"位置。
我的问题比我链接的问题更笼统,因为我想将数组转移到任意方向上。在接受的解决方案中,必须始终知道图像的滚动方向,以切断适当的边缘。特别是,这里是接受的解决方案,涉及将数组X转换为1。
import numpy as np
x = np.array([[1, 2, 3],[4, 5, 6]])
print np.pad(x,((0,0),(1,0)), mode='constant')[:, :-1]
要进行反向操作,必须硬编码以下更改:
import numpy as np
x = np.array([[1, 2, 3],[4, 5, 6]])
print np.pad(x,((0,0),(0,1)), mode='constant')[:, 1:]
// changed argument of pad
// and array indices
是否有一种简单的方法可以一次实施?
mode
的pad
的核心是:
newmat = narray.copy()
# API preserved, but completely new algorithm which pads by building the
# entire block to pad before/after `arr` with in one step, for each axis.
if mode == 'constant':
for axis, ((pad_before, pad_after), (before_val, after_val))
in enumerate(zip(pad_width, kwargs['constant_values'])):
newmat = _prepend_const(newmat, pad_before, before_val, axis)
newmat = _append_const(newmat, pad_after, after_val, axis)
因此,pad_width
元组(元组)决定了动作,即预处理或附加恒定垫。请注意,它在轴上迭代。
您自己的代码可能会一样快,因为pad
在这里没有做任何神奇(或编译)的事情。
prepend
函数的串联像:
np.concatenate((np.zeros(padshape, dtype=arr.dtype), arr),
axis=axis)
有关详细信息,请参见np.lib.arraypad.py
。
因此,对于每个非零垫的量,它在所需形状的零块上加入。
In [280]: x = np.array([[1, 2, 3],[4, 5, 6]])
您的两个pad
版本:
In [281]: np.pad(x,((0,0),(1,0)), mode='constant')[:, :-1]
Out[281]:
array([[0, 1, 2],
[0, 4, 5]])
In [282]: np.pad(x,((0,0),(0,1)), mode='constant')[:, 1:]
Out[282]:
array([[2, 3, 0],
[5, 6, 0]])
直接insert
等效物:
In [283]: res = np.zeros_like(x)
In [284]: res[:,1:] = x[:,:-1]
In [285]: res
Out[285]:
array([[0, 1, 2],
[0, 4, 5]])
In [286]: res = np.zeros_like(x)
In [287]: res[:,:-1] = x[:,1:]
In [288]: res
Out[288]:
array([[2, 3, 0],
[5, 6, 0]])
您可以在第一个轴上执行相同的操作。一般表达是
res = np.zeros_like(x)
idx1 = (slice(...), slice(...))
idx2 = (slice(...), slice(...))
res[idx1] = x[idx2]
idx
元组取决于滚动轴和方向。
,例如
idx1 = (slice(None), slice(1,None))
idx2 = (slice(None), slice(None,-1))
有2个轴和2个方向,即4对。