numpy,scipy重新取样的具体方法

时间:2014-01-13 04:31:42

标签: python biopython

我有一个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]] 

现在我的numpy数组在3x20维度。我想重新采样到3x10。 我怎么能用Biopython,numpy或scipy做到这一点?

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

1 个答案:

答案 0 :(得分:4)

虽然问题有点模糊,但如果您要做的就是随机选择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(返回行)
  • 从一个从0到1(solution_space)的linspace进行采样

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