2012-08-16 3 views
1

으로 I는 간격에 의해 정의 xi,yi,zi 입방 격자가 meshgrid. W.shape() == size.NumPy와 3D 전용 도면

클래스 scipy.interpolate.LinearNDInterpolator(points, values) :

매개 변수 :

points : 수레의 ndarray, 모양 (npoints, ndims) 데이터 포인트 좌표 I 입력으로 요구하는 scipy's linear interpolation을 사용하고 싶습니다.

values

: 플로트 또는 착체 ndarray는 (npoints, ...) 데이터 값을 형성.

은 어떻게 xi,yi,zi에서 (마법의 방송을 통해) points의 가짜 세트를 생성합니까? 지금은 보간 함수에 피드 할 중간 배열을 만드는 중입니다 - 더 좋은 방법이 있습니까?

관련 질문 : Numpy meshgrid in 3D. 이 게시물의 답은 실제로 그리드를 작성합니다. 다른 함수 (순수한 numpy 솔루션 선호)의 입력으로 만 시뮬레이션하려고합니다.

+0

Nxdim 배열을 원하지만 실제로 전체 배열을 할당하지 않도록 numpy를 속이는가? 이것은 불가능합니다. 일반 그리드 용으로 설계된 도구를 사용해야하지만, 이것은 scipy에서 더 높은 차원에 대해서는 존재하지 않습니다. – seberg

+0

@Sebastian, 작은 배열로 더 큰 배열을 시뮬레이션 할 수 있습니다. 예를 들어''x.shape, y.shape = (n, m)'이라면'[X, Y] = '를 취하여'f (x, y) = x + y' * np.meshgrid (x, y); S = X + Y'보다는 오히려'S = x + y [:, np.newaxis]'이다. 자세한 내용은 링크 된 질문을 참조하십시오. – Hooked

+0

예, 그렇지만 더 많은 요소를 시뮬레이션 한 다음 실제로 xi, zi, yi 배열 안에 있습니다. 이론적으로 이것은 (stride_tricks와 함께) 가능합니다. 그러나 결과 배열은 2 차원이기 때문에이 경우에는 배열을 구성 할 수 없으며 scipy가 어쨌든 나중에 복사본을 만들지는 않을 것 같지 않습니다. – seberg

답변

3
>>> xi, yi, zi = [np.arange(3) for i in range(3)] 
>>> xx, yy, zz = np.broadcast_arrays(xi,yi[:,np.newaxis],zi[:,np.newaxis,np.newaxis]) 
>>> xx.shape 
(3, 3, 3) 
>>> xx.strides 
(0, 0, 8) 

처음 두 차원에서 스트라이드가 0이기 때문에 새 복사본을 만들지 못했음을 알 수 있습니다. 당신이있는 경우,

xx, yy, zz = np.broadcast_arrays(xi[:,None,None], yi[None,:,None], zi[None,None,:]) 
points = (xx.ravel(), yy.ravel(), zz.ravel()) 
ip = LinearNDInterpolator(points, data.ravel()) 

그러나 :

def ndmesh(*args): 
    args = map(np.asarray,args) 
    return np.broadcast_arrays(*[x[(slice(None),)+(None,)*i] for i, x in enumera\ 
te(args)]) 
+1

(m * n * 1, 3) 포인트 배열에 대해 여분의 _temporary_ 배열 (보기가 아님)을 피할 수있는 유일한 방법은 초기화되지 않은 배열에 삽입하기 위해 xx.flat (ravel 또는 such 대신)를 사용하는 것입니다 points 배열. – seberg

0

난 당신이 전체 복사본의 짧은 LinearNDInterpolator 뭔가를 전달할 수있는 방법은 (세 가지 차원에서 정기적으로 그리드에 대한 기능이 너무 없다로)가 믿지 않는다. 그래서 전체 배열을 만들지 않도록하는 유일한 장소는 배열, 나는 당신이이 점에서 이미 효율적이다 어쩌면 지금 그것을 할 방법을 모르는 된 점이 작성 중에 것입니다,하지만 난을 피하려면 가능성이 가치가없는 문제를 추측 이.

다른 다음 np.mgrid + (너무 N-치수 작성하지 하드에) 옵션 어쩌면 이런 일이 될 수 바꿀 :

# Create broadcastest versions of xi, yi and zi 
# np.broadcast_arrays does not allocate the full arrays 
xi, yi, zi = np.broadcast_arrays(xi[:,None,None], yi[:,None,None], zi[:,None,None]) 

# then you could use .flat to fill a point array: 
points = np.empty((xi.size, 3), dtype=xi.dtype) 
points[:,0] = xi.flat 
points[:,1] = yi.flat 
points[:,2] = zi.flat 

.repeat 기능에 반대를, 임시 배열은 여기에 생성 배열 등, 원래 xi 다음 하지 크다.

1

당신은 다른 답변에서 설명한 바와 같이 유사한 방법으로 필요한 points 배열을 구성 할 수 있습니다 :

나는이 또한의 차원 버전을 썼다 일반 그리드 인 경우 LinearNDInterpolator을 사용하는 것이 가장 좋은 선택이 아닌데, 이는 분산 데이터 보간 용으로 설계 되었기 때문입니다. 데이터 포인트의 델라 네이 (Delaunay) 삼각 측량을 구성하지만,이 경우 원본 데이터는 이미 매우 효율적으로 사용할 수있는 매우 규칙적인 구조를 가지고 있습니다.

그리드가 직사각형이므로 3 차원 1 차 인터폴레이션의 텐서 곱으로 보간법을 만들 수 있습니다. Scipy에는이 기본 제공 (지금까지)이 없지만이 스레드를 참조하십시오. http://mail.scipy.org/pipermail/scipy-user/2012-June/032314.html (예 : 1 차원 보간을 얻기 위해 pchip 대신 interp1d 사용)