【问题标题】:a specific method for numpy, scipy resamplingnumpy、scipy重采样的具体方法
【发布时间】:2014-01-13 04:31:42
【问题描述】:

我有一个 numpy 数组。我想将该 numpy 数组重新采样为特定值,例如 10。

 X = [[  6.99749994  17.76250029   5.01699996]
     [ 10.5150001   18.28000021   4.06300002]
     [ 12.47374988  19.4937501    6.93949986]
     [ 15.38050032  21.92675018   6.68924999]
     [ 17.19525003  19.25349998   7.71924984]
     [ 15.75849962  17.17449951   5.07899988]
     [ 16.83874989  19.46924973   2.56125003]
     [ 20.24999952  19.40649986   3.77824998]
     [ 20.32649994  15.83099985   3.59350002]
     [ 19.17724943  15.48849988   0.23099999]
     [ 21.44624996  18.01575041  -0.98599999]
     [ 24.13700008  16.26849985   0.35250001]
     [ 23.45549965  13.07250023  -0.88625002]
     [ 22.66449976  14.09524989  -4.22149998]
     [ 25.57133357  15.34866651  -4.50566673]
     [ 27.54475021  12.71549988  -4.02225   ]
     [ 25.7732501   11.273       -6.82424998]
     [ 26.65899976  13.21299966  -9.15133333]
     [ 27.97424984  12.19199991 -12.32075   ]
     [ 26.63675022   8.88499999 -11.40549994]] 

现在我的 3x20 维度的 numpy 数组。我想重新采样到 3x10。 如何使用 Biopython、numpy 或 scipy 做到这一点?

这是我需要转换为 python 的重采样函数。 pastebin.com/JsGeNyLp 其中输入是 numpy 数组,N 是任何整数值,例如 10

【问题讨论】:

  • “将 numpy 数组重新采样为特定值,例如 10”是什么意思?您能否编辑您的问题以包含您的预期输出?
  • 这意味着现在我的矩阵是 3x20。我想将其重新采样为 3x10
  • 新值应该是什么?以某种方式插值\计算,还是简单地随意丢弃一半?
  • @sam 你应该真正解释你想要做什么,而不是期望我们通过极其简洁和不透明的变量名称阅读未记录的 MATLAB。
  • @sam 我已经破译了 MATLAB,并将它的功能拼凑成一些 Python 的形式,并在下面解释。

标签: python biopython


【解决方案1】:

虽然这个问题有点含糊,但如果您只想从numpy 数组中随机选择一些元素,python 有一个方便的random 模块可以让您做到这一点:

import random

resampled_X = random.random_sample(X, 10)

查看您链接的 MATLAB 代码,看起来您可能正在寻找除此之外的一些 1d 插值。同样,如果您的问题没有更多细节,很难准确地说出,但 scipy 实际上有一个 interp1d 函数,就像 MATLAB 一样。你可以这样使用它:

from scipy.interpolate import interp1d
x = range(30)
y = [i**2 for i in x]
# quadratic can be replaced with linear, cubic, or just a number for polynomial degree
new_function = interp1d(x, y, 'quadratic')
new_function(1.5)
>>> 2.25

通读您的代码后,我可以将其翻译成numpyscipy 代码,但这是对“重采样”的极其不直观的定义

import numpy as np
from scipy.interpolate import intep1d

def resample(X, N):
    norms = [0] + [np.linalg.norm(X[:,i] - X[:,i-1]) for i in range(1,X.shape[1])]
    cumdel = np.cumsum(norms)/sum(norms)
    solution_space = np.linspace(0,1, N)
    new_function = lambda i: interp1d(cumdel, X[i,:])
    return np.array([new_function(i)(solution_space) for i in range(X.shape[0])]).T

基本上,这段代码看起来是这样的:

  • 构造从数组中的一个条目到下一个条目的变化幅度列表。 (规范列表)
  • 使用 cumsum 对该列表进行规范化,因此它成为“通过此列表中所有更改的百分比”的列表 (cumdel)
  • 沿每一列(在您的示例中为三列)进行插值,然后根据添加的n(返回行)从零到一的 linspace(solution_space)进行采样

这是一件很奇怪的事情,但这就是它正在做的事情。如果您还有其他问题,请告诉我。

【讨论】:

  • norms = np.linalg.norm(X[1:] - X[:-1], axis=0).tolist() 而不是列表理解呢?既然你import numpy as np,你可能不想使用numpy.
  • @chthonicdaemon 听起来很合理。匆忙写了那段代码。
  • 它有错误:IndexError: index 3 is out of bounds for axis 0 with size 3 但是谢谢。我明白代码
  • @sam 这可能是因为你的轴被翻转了。描述中的矩阵是20,3,而不是3,20。如果你转置它,那么这应该可以工作。
  • @sam 哦,哎呀。看起来 chthonicdaemon 的代码也完全被破坏了。没有费心检查,将其切换回旧列表组合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2015-05-19
相关资源
最近更新 更多