有没有办法去"压缩" python中的一个数组,以保持相同的范围,但只是将元素数量减少到给定值?
例如,我有一个包含1000个元素的数组,我想将其修改为100个。具体来说,我有一个numpy数组
x = linspace(-1,1,1000)
但是由于我在项目中使用它的方式,我不能简单地使用linspace重新创建它,因为它不会总是在-1到1的域中并且有1000个元素。这些参数发生了变化,我无法在我定义的函数中访问它们。所以我需要一种方法来压缩数组,同时保持-1到1的映射。把它想象为降低"分辨率"数组。这可能与任何内置函数或不同的库有关吗?
答案 0 :(得分:2)
“重新采样”数组的一种简单方法是将其分组为块,然后平均每个块:
(分块函数来自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]
答案 1 :(得分:0)
您可以随机选择项目以减少您在减少中的任何偏见。如果原始样本是无序的,那就是:
import random
sample = range(1000)
def reduce(sample, count):
work = sample[:]
random.shuffle(work)
return work[:count]
如果订单很重要,请使用枚举跟踪位置并重新组装
def reduce(sample, count):
indexed = [item for item in enumerate(sample)]
random.shuffle(indexed)
trimmed = indexed[:count]
trimmed.sort()
return [item for index,item in trimmed]