如何快速抽取 numpy 数组?

Ric*_*ard 7 python arrays numpy

我需要一个函数来抽取、删除数组中 n 中的 m numpy。例如,删除 2 中的 1 或删除 3 中的 2。所以一个数组是: [7, 4, 3, 5, 9, 2, 4, 1, 6, 8]

按 1:2 减少将变为: [7, 3, 9, 4, 6]

我想知道是否可以将数组从 1d 数组 N 长重塑为 2d 和 N/2, 2 长的数组,然后删除额外的维度?

理想情况下,我不想仅仅转储抽取的样本,而是想找到每组值(在此示例中为对)的最大值。例如: [7, 5, 9, 4, 8]

有没有办法找到每组中的最大值而不是仅仅删除它?

额外的挑战是这里的重点是绘制值。

需要进行抽取,因为绘制每个值需要很长时间,这意味着我必须在绘制数组之前减小数组的大小,但我需要快速完成此操作。所以fororwhile循环会花费太长的时间。

Ale*_*aev 5

值得担心的是简单地丢弃读数,因为重要的读数可能会被丢弃。

对于您描述的任务,值得使用decimation

不幸的是它不在 numpy 中,但在scipy中。

在下面的代码中,我给出了一个丢弃样本会导致错误的示例。

在此输入图像描述

如您所见,原始数据(蓝色)有一个峰值。手动细化可以跳过它(绿色)。如果您从库中应用抽取,那么它将包含在结果中(橙色)。

from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
downsampling_factor = 2

t = np.linspace(0, 1, 50)
y = list(np.random.randint(0,10,int(len(t)/2))) + [50] + list(np.random.randint(0,10,int(len(t)/2-1)))


ydem = signal.decimate(y, downsampling_factor)
t_new = np.linspace(0, 1, len(ydem))

manual_decimation = y[:-downsampling_factor:downsampling_factor]
t_manual_decimation = np.linspace(0, 1, len(manual_decimation))

plt.plot(t, y, '.-', t_new, ydem, 'o-', t_manual_decimation,  manual_decimation, 'x-')
plt.legend(['data', 'scipy decimate', 'manual decimate'], loc='best')
plt.show()
Run Code Online (Sandbox Code Playgroud)

总的来说,这不是一件小事,请小心。

UPD:注意向量的长度必须大于27。


Pau*_*zer 3

找到最大值:

1) k 除以 N:

k,N = 3,18
a = np.random.randint(0,10,N)
a
# array([0, 6, 6, 3, 7, 0, 9, 2, 3, 2, 5, 4, 2, 6, 9, 6, 3, 2])
a.reshape(-1,k).max(1)
# array([6, 7, 9, 5, 9, 6])
Run Code Online (Sandbox Code Playgroud)

2) k 不能整除 N:

k,N = 4,21
a = np.random.randint(0,10,N)
a
# array([4, 4, 6, 0, 0, 1, 7, 8, 2, 3, 0, 5, 7, 1, 1, 5, 7, 8, 3, 1, 7])
np.maximum.reduceat(a, np.arange(0,N,k))
# array([6, 8, 5, 7, 8, 7])
Run Code Online (Sandbox Code Playgroud)

2)应该总是有效,但我怀疑1)在适用的情况下更快