Ваши x
, x2
, y
, y2
массивы кажутся одномерными,
Итак, ваша первая интуиция была правильной, но вам придется внести небольшую поправку в фрагмент массива, который вы вычитаете:
o = x-x2[:356] # 361-5 = 356
o2 = y-y2[:356]
И рабочий пример этого будет:
import numpy as np
freqs = np.random.rand(4600)
psd = np.random.rand(4600)
x = freqs[5:361]
y = psd[5:361]
x2 = freqs[5:4600]
y2 = psd[5:4600]
o = x-x2[:356]
o2 = y-y2[:356]
Редактировать пример графика:
import numpy as np
import matplotlib.pyplot as plt
freqs = np.random.rand(4600)
psd = np.random.rand(4600)
x = freqs[5:361]
y = psd[5:361]
x2 = freqs[5:4600]
y2 = psd[5:4600]
o = abs(x-x2[1:357])
o2 = abs(y-y2[1:357])
plt.semilogy(o, o2, '*',color='r', label='Bx')
plt.show()
Объяснение срезов массива
Согласно вашему коду, у вас есть 2 массива (freq
и psd
), каждый из которых является одномерным и содержит не менее 4600 значений.
Когда вы делаете
x = freqs[5:361]
x = psd[5:361]
Вы извлекаете все значения из позиции 5 в 361-ю позицию, поэтому x
и y
содержат по 356 значений.
Когда вы делаете:
x2 = частота [5: 4600]
y2 = psd [5: 4600]
Вы извлекаете все значения из позиции 5 (так же, как и раньше) в 4600-ю позицию, x2
и y2
, следовательно, содержат 3595 значений каждое
Позже вы пытаетесь сначала вычесть x2
и x
, используя x2[:,:361]
, что означает, что вы рассматриваете x2
как двумерный массив, тогда как на самом деле это 1d, что приводит к ошибке.
Затем вы пытаетесь выполнить o = x2-x
, но, поскольку x
содержит 356 значений, а x2
содержит 3595 значений, Python не знает, что делать.
Если, например, вы хотите вычесть первые 3 значения в следующие 3 в очень простом примере, вы должны сделать следующее:
freq = np.array([3,3,3,2,2,2])
x1 = freq[0:3] # x1 = array([3, 3, 3])
x2 = freq[3:6] # x2 = array([2, 2, 2])
result = x1 - x2 # result = array([1, 1, 1])