2017-12-08 10 views
1

形状の配列(N,2)が与えられたら、すべてのポイントに対してサイズd x dのパッチを取りたいと思います。ポイントのパッチをサンプリングする

d = 3 
points = [[3, 2], [1, 2]] 
patchs = array([[[[2, 1],[3, 1],[4, 1]], 
       [[2, 2],[3, 2],[4, 2]], 
       [[2, 3],[3, 3],[4, 3]]], [[[0, 1],[1, 1],[2, 1]], 
              [[0, 2],[1, 2],[2, 2]], 
              [[0, 3],[1, 3],[2, 3]]]]) 

場合 は、例えば、私は一点のみでそれを行うことができたが、私はN上でループを回避するためにスマートな方法を見つけることができません。これは私がやったことです:

p = [3,2] 
xs = p[0] + [-1,0,1] 
ys = p[1] + [-1,0,1] 
res = np.transpose([np.tile(xs, len(ys)), np.repeat(ys, len(xs))]) 

答えて

1

はここで割り当てのbroadcastingを活用して1つのベクトル化されたアプローチだ -

In [372]: points = np.random.randint(0,9,(1000000,2)) 

In [373]: %%timeit 
    ...: hd = d//2 # half patch size 
    ...: r = np.arange(-hd,hd+1) 
    ...: 
    ...: out = np.empty((len(points),d,d,2), dtype=points.dtype) 
    ...: out[...,0] = points[:,0,None,None] + r 
    ...: out[...,1] = points[:,1,None,None] + r[:,None] 
10 loops, best of 3: 69.9 ms per loop 
- 百万ポイントに

hd = d//2 # half patch size 
r = np.arange(-hd,hd+1) 

out = np.empty((len(points),d,d,2), dtype=points.dtype) 
out[...,0] = points[:,0,None,None] + r 
out[...,1] = points[:,1,None,None] + r[:,None] 

ランタイムテストでは、

関連する問題