ご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
機能などのCONCATENATEん:
np.concatenate((np.zeros(padshape, dtype=arr.dtype), arr),
axis=axis)
は、詳細についてはnp.lib.arraypad.py
を参照してください。
したがって、0でないパッドの量ごとに、希望の形状のゼロブロックを連結します。
In [280]: x = np.array([[1, 2, 3],[4, 5, 6]])
あなたの2つの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]])
あなたが最初の軸で同じことを行うことができます。一般的な表現は、idx
タプルがロール軸と方向に依存
res = np.zeros_like(x)
idx1 = (slice(...), slice(...))
idx2 = (slice(...), slice(...))
res[idx1] = x[idx2]
あります。
idx1 = (slice(None), slice(1,None))
idx2 = (slice(None), slice(None,-1))
2軸と2方向の場合、4ペアです。