如何在没有 for 循环的情况下对 python 中的数组进行下采样
How to down sample an array in python without a for loop
是否有一种 'pythonic' 方法可以在没有多个 for 循环的情况下干净地向下采样?
下面这个例子是我希望摆脱的 for 循环类型。
最小工作示例:
import numpy as np
unsampled_array = [1,3,5,7,9,11,13,15,17,19]
number_of_samples = 7
downsampled_array = []
downsampling_indices = np.linspace(0, len(unsampled_array)-1, number_of_samples).round()
for index in downsampling_indices:
downsampled_array.append(unsampled_array[int(index)])
print(downsampled_array)
结果:
>>> [ 1 5 7 9 13 17 19]
你需要函数np.ix_
,如下:
import numpy as np
unsampled_array = np.array([1,3,5,7,9,11,13,15,17,19])
number_of_samples = 5
downsampling_indices = np.linspace(0, len(unsampled_array)-1, number_of_samples).round()
downsampling_indices = np.array(downsampling_indices, dtype=np.int64)
indices = np.ix_(downsampling_indices)
downsampled_array = unsampled_array[indices]
print(downsampled_array)
如果你想要 "real" 下采样,其中每个值是 k 个值的平均值,你可以使用
unsampled_array.reshape(-1, k).mean(1)
确保 unsampled_array 是 np.array。在你的例子中,k=2。那会给你:
[ 2. 6. 10. 14. 18.]
*更新:如果你只想对每k项取第一项,可以用这个代码:
unsampled_array.reshape(-1, 2)[:, 0]
看看这个情节:
是否有一种 'pythonic' 方法可以在没有多个 for 循环的情况下干净地向下采样?
下面这个例子是我希望摆脱的 for 循环类型。
最小工作示例:
import numpy as np
unsampled_array = [1,3,5,7,9,11,13,15,17,19]
number_of_samples = 7
downsampled_array = []
downsampling_indices = np.linspace(0, len(unsampled_array)-1, number_of_samples).round()
for index in downsampling_indices:
downsampled_array.append(unsampled_array[int(index)])
print(downsampled_array)
结果:
>>> [ 1 5 7 9 13 17 19]
你需要函数np.ix_
,如下:
import numpy as np
unsampled_array = np.array([1,3,5,7,9,11,13,15,17,19])
number_of_samples = 5
downsampling_indices = np.linspace(0, len(unsampled_array)-1, number_of_samples).round()
downsampling_indices = np.array(downsampling_indices, dtype=np.int64)
indices = np.ix_(downsampling_indices)
downsampled_array = unsampled_array[indices]
print(downsampled_array)
如果你想要 "real" 下采样,其中每个值是 k 个值的平均值,你可以使用
unsampled_array.reshape(-1, k).mean(1)
确保 unsampled_array 是 np.array。在你的例子中,k=2。那会给你:
[ 2. 6. 10. 14. 18.]
*更新:如果你只想对每k项取第一项,可以用这个代码:
unsampled_array.reshape(-1, 2)[:, 0]
看看这个情节: