有没有办法在
python中“压缩”一个数组,以保持相同的范围,但只是将元素的数量减少到给定的值?
例如,我有一个包含1000个元素的数组,我想将其修改为100个.具体来说,我有一个numpy数组
x = linspace(-1,1,1000)
但由于我在项目中使用它的方式,我不能简单地使用linspace重新创建它,因为它不会总是在-1到1的域中并且有1000个元素.这些参数发生了变化,我无法在我定义的函数中访问它们.所以我需要一种方法来压缩数组,同时保持-1到1的映射.可以把它想象为降低阵列的“分辨率”.是否可以使用任何内置函数或不同的库?
最佳答案 “重新采样”数组的一种简单方法是将其分组为块,然后平均每个块:
(分块功能从this answer开始)
# Chunking function
def chunks(l, n):
for i in xrange(0, len(l), n):
yield l[i:i+n]
# Resampling function
def resample(arr, newLength):
chunkSize = len(arr)/newLength
return [np.mean(chunk) for chunk in chunks(arr, chunkSize)]
# Example:
import numpy as np
x = np.linspace(-1,1,15)
y = resample(x, 5)
print y
# Result:
# [-0.85714285714285721, -0.4285714285714286, -3.7007434154171883e-17, 0.42857142857142844, 0.8571428571428571]
如您所见,重采样数组的范围确实向内漂移,但对于较大的数组,此效果会小得多.
我不清楚数组是否总是由numpy.linspace生成.如果是这样,有更简单的方法可以做到这一点,比如简单地选择原始数组的每个第n个成员,其中n由“压缩”比率决定:
def linearResample(arr, newLength):
spacing = len(arr) / newLength
return arr[::spacing]