我想知道在Numpy或SciPy中是否有Python功能可以将数组移动到非均匀网格上。 我已经创建了一个最小示例来说明这个过程,但在这个最小示例中似乎并不起作用:
import numpy as np
import matplotlib.pyplot as pyt
def roll_arrays( a, shift_values,x_grid ):
#from scipy.interpolate import interp1d
x_max = np.amax(x_grid)
total_items = a.shape[0]
the_ddtype = a.dtype
result = np.zeros( (a.shape[0], a.shape[1] ), dtype=the_ddtype )
for k in range( total_items ):
edge_val_left = a[k,0]
edge_val_right = a[k,-1]
#extend grid to edges with boundary values (flat extrapolation)
extended_boundary = np.abs( shift_values[k] )#positive or negative depending on shift
if( shift_values[k] != 0.0 ):
x0_right = np.linspace( x_max +1e-3, x_max + 1e-3 + extended_boundary, 10 )
x0_left = np.linspace( -x_max - 1e-3 -extended_boundary, -x_max - 1e-3, 10 )
if( shift_values[k]>0.0 ):
#we fill left values
x_dense_grid = np.concatenate( ( x0_left, x_grid + shift_values[k] ) )
ynew = np.concatenate( ( edge_val_left*np.ones( 10 ), a[k,:] ) )
elif( shift_values[k]<0.0 ):
x_dense_grid = np.concatenate( ( x_grid + shift_values[k], x0_right ) )
ynew = np.concatenate( ( a[k,:], edge_val_right*np.ones( 10 ) ) )
###
#return on the original grid
f_interp = np.interp( x_grid, x_dense_grid, ynew )
result[k,:] = f_interp
else:
#no shift
result[k,:] = a[k,:]
return result
x_geom = np.array( [ 100*( 1.5**(-0.5*k) ) for k in range(1000)] )
x_geom_neg =-( x_geom )
x_geom = np.concatenate( (np.array([0.0]), np.flip(x_geom)) )
x_geom = np.concatenate( (x_geom_neg, x_geom) )
shifts = np.array([-1.0,-2.0,1.0])
f = np.array( [ k**2/( x_geom**2 + k**4 ) for k in range(1,shifts.shape[0]+1) ] )
fs = roll_arrays( f, shifts, x_geom)
pyt.plot( x_geom, f[0,:], marker='.' )
pyt.plot( x_geom, fs[0,:], marker='.' )
print("done")
注意,在这种情况下,“x_grid”的数据点是以对数间隔分布的。有没有一种方法可以利用Scipy / Numpy进行这样的操作?通过插值方法或类似方法实现。
编辑:我注意到删除有关边界移位(执行平坦外推)的if,elif,else语句似乎解决了问题;但我仍然认为这对于应该已经存在于Python中的问题来说过于天真; 所以问题仍然存在。