如何在numpy中使用Blackman Window从数组中获取值的一部分?

时间:2016-11-26 17:33:33

标签: python arrays numpy

我想获取数组的一部分值(比如500个值)并对其执行一些操作,例如取这些500个值的平方和。然后继续执行相同数组的下500个值。

我该如何实现?在这种情况下,blackman窗口是否有用,或者另一种方法更合适?

2 个答案:

答案 0 :(得分:0)

假设你的数组a是1D且它的长度是500的倍数,那么简单的obj[0]["id"]就足够了。如果您想要更复杂的操作,请相应地编辑您的问题。

答案 1 :(得分:0)

这取决于几个标准:

  1. 每个操作的元素数是否是数组长度的整数除数?

  2. 元素数量是数组长度的重要部分吗?

  3. 如果1.为True,那么您可以重塑数组以使用.sum(axis=axis)之类的reduce函数,这可能是最高效的方式。见@P。 Camilleri回答了这个案子。

    然而,如果1.为假,则第二个问题变得重要。如果你回答"是" 2.然后你可以在数组上使用for循环,因为Python循环开销对迭代次数很少的循环来说并不那么重要:

    width = 500
    for i in range(0, arr.size, width):
        print(arr[i:i+width])  # do your operation here!
    

    但是,如果您的回答是"否"到1.和2.您可能应该使用卷积滤镜(请参阅scipy.ndimage.filters),然后只选择有趣的元素:

    width = 10
    result = some_filter(arr)
    # take only the elements starting by width_half and make "width" stepsize
    result = result[(width-0.5)//2, :, width]  
    

    例如,平方和:

    import numpy as np
    
    arr = np.random.randint(0, 10, (25))
    arr_squared = arr ** 2
    
    width = 10
    for i in range(0, arr_squared.size, width):
        print(arr_squared[i:i+width].sum())
    # 267, 329, 170
    

    或使用卷积:

    from scipy.ndimage import convolve
    
    convolve(arr_squared, np.ones(width), mode='constant')[4::10]
    # array([267, 329, 170])