python - 有没有办法在python中对具有不匹配索引的数组进行子集化?
问题描述
为了重现性,我目前正在将 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: index 100 is out of bounds for axis 0 with size 100
解决方案
与 R、Python 和大多数其他编程语言相反,使用从零开始的索引。因此,包含元素的数组/列表以.n
开头x[0]
和结尾x[n-1]
。在您的情况下,x[99]
是列表的最后一个元素,并且x[100]
超出范围,因此会产生错误。
推荐阅读
- sql - 此代码中的字段如何结合不同的名称?
- javascript - PerformanceObserver 无法测量重定向请求的时间
- php - PHP无法将查询结果分配给变量
- java - 如何在 Java 中使用 3DES(三重 DES)加密和解密文件
- python - 如何获取数据透视表的索引作为列
- sas - 如何创建一个宏变量使用来自另一个数据集的数据替换从/到?
- javascript - 如何正确使用作用域?
- python-3.x - ModuleNotFoundError: No module named 'virtualenv' 由于失败而退出,即使在为 AWS EBCLI 成功安装虚拟环境之后也是如此
- batch-file - 删除早于特定文件修改日期的文件
- sql - TSQL - 计算植物和年份数月的值