2017-07-06 47 views
0

documentationSciPy的-interp2d返回功能自動地和不期望排序輸入參數

import matplotlib.pyplot as plt 
from scipy import interpolate 
import numpy as np 
x = np.arange(-5.01, 5.01, 0.25) 
y = np.arange(-5.01, 5.01, 0.25) 
xx, yy = np.meshgrid(x, y) 
z = np.sin(xx+yy) 
f = interpolate.interp2d(x, y, z, kind='cubic') 

我繼續評估F:

xnew = np.arange(-5.01, 5.01, 1e-2) 
f(xnew, 0) 

輸出:

array([ 0.95603946, 0.9589498 , 0.96176018, ..., -0.96443103, 
    -0.96171273, -0.96171273]) 

倒車參數給出了相同的結果!我期待得到逆轉之一:

xnewrev=np.array(list(reversed(np.arange(-5.01, 5.01, 1e-2)))) 
f(xnewrev, 0) 

輸出:

array([ 0.95603946, 0.9589498 , 0.96176018, ..., -0.96443103, 
    -0.96171273, -0.96171273]) 

預計:

array([-0.96171273, -0.96171273, -0.96443103, ..., 0.96176018, 
    0.9589498 , 0.95603946]) 

我得到同樣的結果還洗牌xnew後。在評估之前,似乎內插功能f分類xnew。如何使f的返回值與輸入列表中給出的順序相同?

不知何故,這不是interp1d的問題。

我使用Jupyter筆記本,巨蟒2.7.12 |蟒蛇4.1.1(64位)

回答

0

f調用需要一個assume_sorted參數:

assume_sorted : bool, optional 
    If False, values of `x` and `y` can be in any order and they are 
    sorted first. 
    If True, `x` and `y` have to be arrays of monotonically 
    increasing values. 

所以,是的,輸入如果您之前沒有對其進行排序,則會在內部進行排序。我沒有看到獲取排序後的座標的方法。

x,y輸入到interp2d也使用前排序。顯然插值計算需要排序的數組。

可以恢復具有雙重argsort指數排序預購

做一個數組,將它洗:

In [415]: xnew = np.arange(-10,11,2) 
In [416]: xnew 
Out[416]: array([-10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10]) 
In [417]: np.random.shuffle(xnew) 
In [418]: xnew 
Out[418]: array([ 0, 2, 6, -2, 10, -4, 8, -8, -10, -6, 4]) 

獲得恢復指數:

In [419]: idx = np.argsort(np.argsort(xnew)) 
In [420]: idx 
Out[420]: array([ 5, 6, 8, 4, 10, 3, 9, 1, 0, 2, 7], dtype=int32) 

測試:

In [421]: np.sort(xnew)[idx] 
Out[421]: array([ 0, 2, 6, -2, 10, -4, 8, -8, -10, -6, 4])