通过计算拆分数组中的值的函数填充for循环的拆分数组

Splitted Array being filled in for loop by function calculating values from a splitted array

我遇到了一个 for 循环问题。

我有一个数组形式的信号,我将它分成多个时期。

times = np.arange(0, duration, 1 / sfreq)
nse1 = np.random.rand(times.size) * nse_amp
x =  amp * np.sin( 2 * np.pi * 200 * times            ) + nse1
x2 = np.array_split(x,epochs)

我第二次为 y 信号执行此操作。 假设我的信号 x 具有 (100) 的形状,那么我的 2 个时期的拆分数组应该具有 (2, 50).

的形式

现在我想在 for 循环中使用一个函数来计算拆分数组的每个段的每个值的值...类似于:

for i in range(0,epochs):
    Rxy[i], freqs_xy[i] = mlab.csd(x2[i], y2[i], NFFT=nfft, Fs=sfreq)

所以我会得到一个 Rxy 数组,例如 (2, 50)

希望你能得到我想做的事。

您好, 丹尼尔

要将 Rxy 构建为数组,请先为数组分配 space:

Rxy = np.empty_like(x2)
freqs_xy = np.empty_like(x2)

然后您可以使用循环填充 Rxy 的行:

for i in range(2):
    Rxy[i], freqs_xy[i] = mlab.csd(x2[i], y2[i], NFFT=nfft, Fs=sfreq)

顺便说一下,np.array_split(x,epochs) returns 一个 list 数组。那不是 与形状数组 (2, 50) 相同。如果你能保证 epochsx 分成等长的数组,你可以使用

x2 = x.reshape(2, -1)

相反。那么 x2 将是一个 数组 ,形状为 (2, 50)reshape 更快 比 array_split 因为 reshape 只需要改变一个属性,而 array_split 必须分配数据并将其复制到新数组中。更何况是 通常最好将数据保存在一个大数组中而不是列表中的部分 数组,因为对列表的计算通常需要 Python 循环 使用 NumPy 时性能的祸根。当然,有时 Python 循环 无法避免,就像调用 mlab.csd.

时的情况一样