在python中有没有一种方法可以用不匹配的索引来子集数组?

2024-09-29 23:20:42 发布

您现在位置:Python中文网/ 问答频道 /正文

为了重现性,我正在将一个R文件翻译成python。我被一个名为get\u density的用户定义函数困住了(见下文)。部分用户定义函数使用R的核密度估计函数,该函数返回3个数组的列表。我的问题在用户定义函数的最后一行。在该行中,kde2d列表的最后一个元素从该列表中子集化,然后该元素由一个单独的矩阵子集化。当我在python中尝试同样的操作时,我收到错误“index 100超出了大小为100的轴0的界限。”

我现在正在从Spyder的rStudio翻译。我重新创建了kde2d和get\ density函数,除了最后一行,但是当我尝试在python中对结果矩阵“z”进行子集划分时,我不断收到一条错误消息。你知道吗

这是我要翻译的原始R代码:

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])
}

下面是我的python翻译:

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])

导致错误的是返回(z[ii])行。你知道吗

工作R代码的结果是一个数值列表,这就是我在python中想要的。然而,我在python中得到的唯一结果是 索引器错误:索引100超出大小为100的轴0的界限


Tags: 函数用户列表get定义错误npdensity
1条回答
网友
1楼 · 发布于 2024-09-29 23:20:42

与R、Python和大多数其他编程语言相反,使用基于零的索引。因此,带有n元素的数组/列表以x[0]开始,以x[n-1]结束。在您的例子中,x[99]是列表的最后一个元素,x[100]超出了范围,因此它产生了一个错误。你知道吗

相关问题 更多 >

    热门问题