我有一个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。
答案 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
在阅读完代码后,我可以将其翻译成numpy
和scipy
代码,但这对于“重新取样”是一个非常不直观的定义
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
基本上这段代码看起来是这样的:
n
(返回行)有点奇怪的事情,但这就是它正在做的事情。如果您还有其他问题,请告诉我。