在python中压缩数组?

时间:2014-09-07 19:04:21

标签: python arrays python-2.7 numpy

有没有办法去"压缩" python中的一个数组,以保持相同的范围,但只是将元素数量减少到给定值?

例如,我有一个包含1000个元素的数组,我想将其修改为100个。具体来说,我有一个numpy数组

x = linspace(-1,1,1000)

但是由于我在项目中使用它的方式,我不能简单地使用linspace重新创建它,因为它不会总是在-1到1的域中并且有1000个元素。这些参数发生了变化,我无法在我定义的函数中访问它们。所以我需要一种方法来压缩数组,同时保持-1到1的映射。把它想象为降低"分辨率"数组。这可能与任何内置函数或不同的库有关吗?

2 个答案:

答案 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]