在python中有没有一种方法可以使用非匹配索引对数组进行子集划分?
为了再现性,我目前正在将一个R文件翻译成python。我被一个名为get_density(见下文)的用户定义函数卡住了。部分用户定义函数使用R的核密度估计函数,该函数返回3个数组的列表。我的问题在用户定义函数的最后一行。在该行中,kde2d列表的最后一个元素从列表中子集,然后该元素由一个单独的矩阵子集。当我在python中尝试同样的方法时,我收到错误“索引100超出了大小为100的轴0的界限。” 我目前正在从Spyder的rStudio翻译。除了最后一行,我重新创建了kde2d和get_density函数,但是当我尝试在python中对生成的矩阵“z”进行子集时,我不断收到一条错误消息 以下是我试图翻译的原始R代码:在python中有没有一种方法可以使用非匹配索引对数组进行子集划分?,python,r,Python,R,为了再现性,我目前正在将一个R文件翻译成python。我被一个名为get_density(见下文)的用户定义函数卡住了。部分用户定义函数使用R的核密度估计函数,该函数返回3个数组的列表。我的问题在用户定义函数的最后一行。在该行中,kde2d列表的最后一个元素从列表中子集,然后该元素由一个单独的矩阵子集。当我在python中尝试同样的方法时,我收到错误“索引100超出了大小为100的轴0的界限。” 我目前正在从Spyder的rStudio翻译。除了最后一行,我重新创建了kde2d和get_dens
get_density <- function(x, y, n = 100) {
dens <- MASS::kde2d(x = x, y = y, n = n)
ix <- findInterval(x, dens$x)
iy <- findInterval(y, dens$y)
ii <- cbind(ix, iy)
return(dens$z[ii])
}
导致错误的是返回(z[ii])行
工作R代码的结果是一个数值列表,这就是我在python中想要的。然而,我在python中得到的唯一结果是
索引器错误:索引100超出了大小为100的轴0的范围,与R、Python和大多数其他编程语言相反,它使用基于零的索引。因此,包含
n
元素的数组/列表以x[0]
开头,以x[n-1]
结尾。在您的情况下,x[99]
是列表的最后一个元素,x[100]
超出范围,因此它会产生一个错误。那么您将如何解决我的问题?我试着使用N=99,它给了我相同的错误,除了不是100,而是99
def kde2d(vals1, vals2, N):
x=np.linspace(np.min(vals1), np.max(vals1), N)
y=np.linspace(np.min(vals2), np.max(vals2), N)
X,Y=np.meshgrid(x,y)
positions = np.vstack([Y.ravel(), X.ravel()])
values = np.vstack([vals1, vals2])
kernel = sstat.gaussian_kde(values)
Z = np.reshape(kernel(positions).T, X.shape)
return [x, y, Z]
def get_density(x, y, N):
dens = kde2d(x, y, N)
ix = np.searchsorted(dens[0], x)
iy = np.searchsorted(dens[0], y)
ii = np.vstack([ix, iy])
ii = np.rot90(ii)
ii = np.flip(ii)
ii = np.flip(ii, axis=1)
z = dens[2]
return(z[ii])