Вычитание двух участков в matplotlib - PullRequest
0 голосов
/ 04 июля 2018

У меня есть два графика, которые я хотел бы вычесть, но я сталкиваюсь с некоторыми ошибками. Мой код выглядит так:

В целом:

for dataset in [Bxfft]:
    dataset = np.asarray(dataset)
    freqs, psd = signal.welch(dataset, fs=52718/300, window='hamming', nperseg=16384, scaling='spectrum')
    plt.semilogy(freqs[5:4600], psd[5:4600]/dataset.size**0, color='r', label='Bx')

    x = freqs[5:361]
    y = psd[5:361]
    x2 = freqs[5:4600]
    y2 = psd[5:4600]

Я пытаюсь вычесть x2 - x и y2 - y. Я пытался сделать это двумя способами, но я получил несколько ошибок:

  1. o = x-x2[:,:361] o2 = y-y2[:,:361] plt.semilogy(o, o2 / dataset.size ** 0, color='r', label='Bx')

И ошибка выглядит так:

Traceback (последний последний вызов): файл «S: /Doktorat/Python/Data/Dekomp/substraction.py», строка 57, в o = x-x2 [:,: 4800] IndexError: слишком много индексов для массива

  1. o = x2-x o2 = y2-y plt.semilogy(o, o2 / dataset.size ** 0, color='r', label='Bx')

И ошибка выглядит так:

Traceback (последний последний вызов): файл «S: /Doktorat/Python/Data/Dekomp/substraction.py», строка 57, в o = x2-x ValueError: операнды не могут быть переданы вместе с фигурами (4595,) (356,)

Есть идеи, что делать?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Ваши 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])
0 голосов
/ 04 июля 2018

Его простая матричная задача. В качестве базовых операций с матрицами, таких как вычитание и сложение, можно выполнять только тогда, когда обе матрицы имеют одинаковые размеры, а в вашем случае это не так. Вот почему ошибка есть. Вам нужно изменить матрицу большего размера на более низкое, чтобы вычесть их.

...