2016-09-05 3 views
3

4 개의 변수 a, b, c 및 d에 의존하는 데이터가 있다고 가정합니다. 보간은 a와 b의 단일 값에 해당하는 2D 배열과 c와 d에 대한 값 배열을 반환해야합니다. 그러나 배열 크기는 동일 할 필요는 없습니다. 구체적으로 말하자면, 제 데이터는 트랜지스터 시뮬레이션에서 가져온 것입니다. 전류는 4 개의 변수에 따라 달라집니다. 나는 파라 메트릭 변형을 그려보고 싶다. 매개 변수의 점 수는 가로 축의 점 수보다 훨씬 적습니다.N 차원 배열을 보간하기 위해 scipy.interpolate.interpn 사용하기

import numpy as np 
from scipy.interpolate import interpn 
arr = np.random.random((4,4,4,4)) 
x1 = np.array([0, 1, 2, 3]) 
x2 = np.array([0, 10, 20, 30]) 
x3 = np.array([0, 10, 20, 30]) 
x4 = np.array([0, .1, .2, .30]) 
points = (x1, x2, x3, x4) 

다음 작품 :

xi = (0.1, 9, np.transpose(np.linspace(0, 30, 4)), np.linspace(0, 0.3, 4)) 
result = interpn(points, arr, xi) 

등이 수행합니다

xi = (0.1, 9, 24, np.linspace(0, 0.3, 4)) 
result = interpn(points, arr, xi) 

만하지이 : 당신이 볼 수 있듯이

xi = (0.1, 9, np.transpose(np.linspace(0, 30, 3)), np.linspace(0, 0.3, 4)) 
result = interpn(points, arr, xi) 

, 지난 경우 , 마지막 두 배열의 크기는입니다.은 다릅니다. 이 기능이 scipy에서 지원하지 않습니까? 아니면 interpn을 잘못 사용하고 있습니까? 이 그림을 만들려면 xi 중 하나가 매개 변수이고 다른 하나는 가로 축입니다.

+0

정확하게'interpn'을 사용하지 않는 것처럼 보입니다 ... 나는'points'가 그리드를 나타내는 것으로 가정합니다. 즉, 네 개의 차원에서 각각 "샘플링 포인트"를 나타내는 것으로 가정합니다. 'arr'은 이러한 알려진 값을 가지고 있습니다.그러나 무작위로 만들면 보간이 작동하는지 여부를 확인하기가 어렵습니다. 대신에 네 가지 차원에서 각각 똑같이 또는 더 좋게 만들어보십시오. 'xi'는'arr'의 값을 알고 자하는 지점의 _coordinates_이어야합니다. 'xi'는 k 행, k 점, 4 열 (4D 데이터)의 k 행 배열이어야합니다. – Praveen

+0

감사합니다. Praveen! 그러나 제 질문은 다음과 같습니다. 내가 4 개의 변수에 의존하는 데이터를 가지고 있다고 가정 해보자 : a, b, c, d. 보간은 a와 b의 단일 값에 해당하는 2D 배열과 c와 d에 대한 값 배열을 반환해야합니다. 그러나 배열 크기는 동일 할 필요는 없습니다. 구체적으로 트랜지스터 시뮬레이션에서 얻은 데이터입니다. 전류는 4 개의 변수에 따라 달라집니다. 나는 파라 메트릭 변형을 그려보고 싶다. 매개 변수의 점 수는 가로 축의 점 수보다 훨씬 적습니다. –

+0

다음 번에 주석에 많은 정보를 추가하는 대신 직접 질문을 편집하십시오. – Praveen

답변

4

나는이 사실을 2D로 설명하여 어떤 일이 일어나고 있는지 더 잘 이해할 수 있도록 노력할 것입니다. 먼저 테스트 할 선형 배열을 만듭니다.

import numpy as np 

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 

# Set up grid and array of values 
x1 = np.arange(10) 
x2 = np.arange(10) 
arr = x1 + x2[:, np.newaxis] 

# Set up grid for plotting 
X, Y = np.meshgrid(x1, x2) 

# Plot the values as a surface plot to depict 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
surf = ax.plot_surface(X, Y, arr, rstride=1, cstride=1, cmap=cm.jet, 
         linewidth=0, alpha=0.8) 
fig.colorbar(surf, shrink=0.5, aspect=5) 

이 우리를 제공합니다 surface plot of values

을 그럼, 당신이 즉 선을 따라 보간하고 싶은 말은하자, 하나의 첫 번째 차원을 따라 점,하지만 두 번째 차원을 따라 모든 점. 이 점들은 당연히 원래 배열 (x1, x2)에 없습니다. x1 축의 두 점 사이에있는 점 x1 = 3.5으로 보간하려고한다고 가정합니다. 블랙 포인트가 제대로 3.5의 1 개 값으로, 비행기에 놓여 있습니다 : 이것은 당신이 원하는대로 결과를 제공

from scipy.interpolate import interpn 

interp_x = 3.5   # Only one value on the x1-axis 
interp_y = np.arange(10) # A range of values on the x2-axis 

# Note the following two lines that are used to set up the 
# interpolation points as a 10x2 array! 
interp_mesh = np.array(np.meshgrid(interp_x, interp_y)) 
interp_points = np.rollaxis(interp_mesh, 0, 3).reshape((10, 2)) 

# Perform the interpolation 
interp_arr = interpn((x1, x2), arr, interp_points) 

# Plot the result 
ax.scatter(interp_x * np.ones(interp_y.shape), interp_y, interp_arr, s=20, 
      c='k', depthshade=False) 
plt.xlabel('x1') 
plt.ylabel('x2') 

plt.show() 

. 은 "마법"하고 질문에 대한 대답의 대부분은이 두 라인에있다 surface plot of interpolated points

참고 :

interp_mesh = np.array(np.meshgrid(interp_x, interp_y)) 
interp_points = np.rollaxis(interp_mesh, 0, 3).reshape((10, 2)) 

나는이 elsewhere의 작업을 설명했다. 즉, 크기 10x2의 배열을 만들고, 보간하고자하는 10 점의 좌표를 arr에 포함시켜야합니다. (해당 게시물이 하나의 유일한 차이가 나는 arange s의 무리에 대한 np.meshgrid를 작성에 대한 바로 가기입니다 np.mgrid에 대한 그 설명을 작성한 것입니다.) 당신의 4x4x4x4 사례를 들어

, 당신은 아마 뭔가가 필요합니다 좋아요 :

interp_mesh = np.meshgrid([0.1], [9], np.linspace(0, 30, 3), 
          np.linspace(0, 0.3, 4)) 
interp_points = np.rollaxis(interp_mesh, 0, 5) 
interp_points = interp_points.reshape((interp_mesh.size // 4, 4)) 
result = interpn(points, arr, interp_points) 

희망이 있습니다.

+0

나는 이것을 잠시 생각할 것이다. 좋은 대답. – Moritz

+0

Praveen, 도와 줘서 고마워. 이전에 응답하지 않았던 것에 대해 사과드립니다. 나는 지금이 프로젝트로 돌아갈 시간이있다. 당신이 설명했던 것은 효과가 있었고 당신의 설명은 아름다웠습니다. –

+0

필자는 필자가 필요로하는 것을 얻기 위해 한 번 더 단계가 필요하다는 것을 덧붙이겠다. 필자의 질문에 구체적인 예를 들어 2 차원 배열을 기대하기 때문에 결과를 재구성 할 필요가 있었다. –

관련 문제