我想获取数组的一部分值(比如500个值)并对其执行一些操作,例如取这些500个值的平方和。然后继续执行相同数组的下500个值。
我该如何实现?在这种情况下,blackman窗口是否有用,或者另一种方法更合适?
答案 0 :(得分:0)
假设你的数组a是1D且它的长度是500的倍数,那么简单的obj[0]["id"]
就足够了。如果您想要更复杂的操作,请相应地编辑您的问题。
答案 1 :(得分:0)
这取决于几个标准:
每个操作的元素数是否是数组长度的整数除数?
元素数量是数组长度的重要部分吗?
如果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])