2013-10-16 3 views
3

너피 (Numpy) 배열 data .... 데이터입니다. Numpy 어레이 z에 거리가 있습니다. 데이터와 z는 같은 모양을 가지며 z의 각 점은 데이터의 해당 점을 측정 한 거리입니다. 문제를 복잡하게 만들려면 3, 4 또는 5 차원의 데이터/z 배열을 제공해야합니다.1D numpy/scipy 보간법이 1D가 아닙니다

1D numpy 배열 dists에서 거리 집합으로 데이터를 보간하고 싶습니다. 데이터 구조로 인해, 보간 축은 항상 끝에서부터 두 축입니다. 즉, 배열이 3 차원 인 경우 보간 축은 0입니다. 배열에 4 차원이 있으면 보간 축은 1입니다. AFAICT 이후 모든 numpy/scipy 보간 루틴은 원래 거리가 1D 배열로 지정되기를 원하기 때문에 데이터와 z를 dist에 보간하는 것은 다소 복잡한 작업으로 보입니다 .

def dist_interp(data, z, dists): 
    # construct array to hold interpolation results 
    num_dims = len(data.shape) 
    interp_axis = num_dims-3 
    interp_shape = list(data.shape) 
    interp_shape[interp_axis] = dists.shape[0] 
    interp_res = np.zeros(shape=interp_shape) 
    # depending on usage, data could have between 3 and five dimensions. 
    # add dims to generalize. I hate doing it this way. Must be 
    # some other way. 
    for n in range(num_dims, 5) : 
     data = np.expand_dims(data, axis=0) 
     z = np.expand_dims(z, axis=0) 
     interp_res = np.expand_dims(interp_res, axis=0) 
    for m in range(data.shape[0]): 
     for l in range(data.shape[1]): 
      for j in range(data.shape[3]): 
       for i in range(data.shape[4]): 
        interp_res[m,l,:,j,i]=(
            np.interp(dists,z[m,l,:,j,i], 
              data[m,l,:,j,i])) 
    # now remove extra "wrapping" dimensions 
    for n in range(0,5-num_dims): 
     interp_res = interp_res[0] 
    return(interp_res) 

나는이 작동합니다 생각하지만, 추가 및 더미 치수를 "포장"추가 제거하는 것은 매우 우아하고 전혀 컴팩트 코드합니다 : 이것은 내가 가지고있는 것입니다. 더 좋은 아이디어? 감사. 상황이 이런 종류의 엄지 손가락의 일반적인 규칙으로

+0

게시물에 몇 가지 입력 데이터를 추가 할 수 있습니까? 원하는 경우 동일한 모양의 무작위 데이터를 생성 할 수 있습니다. – YXD

답변

4

:

  1. 이동이
  2. 가 바꿀 모양 튜플의 끝 부분에 물건을 수행 할 축 결과 배열은 2D 될
  3. 이 2D 하나 개
  4. 취소에서 새 배열을 만들 귀하의 경우에 대한 새로운 배열

에 2 단계 1, 그것은 솜을 볼 수 있었다 다음과 같이 입력하십시오 :

# Create some random test data 
axis = -2 
shape = np.random.randint(10, size=(5,)) 
data = np.random.rand(*shape) 
data = np.sort(data, axis=axis) 
z = np.random.rand(*shape) 
dists = np.linspace(0,1, num=100) 

data = np.rollaxis(data, axis, data.ndim) 
new_shape = data.shape 
data = data.reshape(-1, data.shape[-1]) 
z = np.rollaxis(z, axis, z.ndim) 
z = z.reshape(-1, z.shape[-1]) 

out = np.empty(z.shape[:1]+dists.shape) 
for o, x, f in zip(out, data, z): 
    o[:] = np.interp(dists, x, f) 

out = out.reshape(new_shape[:-1]+dists.shape) 
out = np.rollaxis(out, -1, axis) 
+0

감사합니다. 정확히 내가 필요로하는 것처럼 보인다! –

관련 문제