【问题标题】:Is there a way to subset arrays with nonmatching indices in python?有没有办法在python中对具有不匹配索引的数组进行子集化?
【发布时间】:2019-08-06 00:24:39
【问题描述】:

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

我目前正在从 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])

是 return(z[ii]) 行导致错误。

工作 R 代码的结果是一个数值列表,这就是我在 python 中想要的。但是我在 python 中得到的唯一结果是 IndexError:索引 100 超出轴 0 的范围,大小为 100

【问题讨论】:

    标签: python r


    【解决方案1】:

    与 R、Python 和大多数其他编程语言相反,使用 从零开始的索引。因此,具有n 元素的数组/列表以x[0] 开头并以x[n-1] 结尾。在您的情况下,x[99] 是列表的最后一个元素,x[100] 超出范围,因此会产生错误。

    【讨论】:

    • 那你将如何解决我的问题?我尝试使用 N=99,它给了我同样的错误,除了 100,它说 99
    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2022-11-17
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多