2017-12-11 8 views
0

私はxとy次元の適切なオフセットを知っているイメージのようなデータのセットを再配置しようとしています。同様にthis質問と同様に私は "ロール"のようなことをしたいが、定期的な境界条件を仮定するのではなく、配列の空の位置をゼロで埋めたい。python numpy任意の方向のパディング付きロール

私の質問は、私が任意の方向に配列をシフトしたいのでリンクしているよりも一般的です。受け入れられた解決策では、適切なエッジをカットするために、画像がどの方向に回転しているかを常に知っていなければなりません。

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 

があります:特に、ここでは逆の操作を行うには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] 
しかし

によって配列xをシフトする必要受け入れたソリューションであり、一つはハードコードに次のように変更しなければなりません一度に両方を実装する簡単な方法?

答えて

1

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ペアです。

関連する問題