Ошибка значения: x и y должны иметь одинаковое первое измерение, но иметь формы

#python #matplotlib #valueerror

Вопрос:

Интересно, как лучше всего решить следующую проблему в моем сценарии: «Ошибка значения: x и y должны иметь одинаковое первое измерение, но иметь формы (1531,) и (1532,)».

В чем здесь проблема? Проблема в том, что оси x и y графика не имеют одинакового количества значений (входных данных) для построения. Результатом является приведенное выше сообщение об ошибке.

Давайте сначала посмотрим на код:

 # Initialize import numpy as np import matplotlib.pyplot as plt from scipy import signal from matplotlib.pyplot import cm  # Numpy.loadtxt – Loads data from a textfile. # Scipy.signal.welch – Creation of the power-spectrum via welch method. f, Welch creates the ideal frequencies (f, Welch = Power Spectrum or Power Spectral Density) Subjects = ["Subject1" "Subject2"]  for Subject in Subjects:  Txt = np.loadtxt("/datadir.../{0}/filename...{0}.txt".format(Subject), comments="#", delimiter=None,  converters=None, skiprows=0, usecols=0, unpack=False, ndmin=0, encoding=None, max_rows=None, like=None)   f, Welch = signal.welch(Txt, fs=1.0, window="hann", nperseg=None, noverlap=None, nfft=3062, detrend="constant", return_onesided=True, scaling="density", axis=-1, average="mean")   BypassZero1 = f[f gt; 0.00000000000001] # Avoids "RuntimeWarning: divide by zero encountered in log"  BypassZero2 = Welch[Welch gt; 0.00000000000001]   Log_f = np.log(BypassZero1, out=BypassZero1, where=BypassZero1 gt; 0)  Log_Welch = np.log(BypassZero2, out=BypassZero2, where=BypassZero2 gt; 0)   plt.plot(Log_f, Log_Welch)  

Строки кода «BypassZero1» и «BypassZero2» указывают Python использовать значения выше 0,00000000000001 только для «f» и «Welch». В противном случае проблема «Предупреждение о времени выполнения: деление на ноль, встречающееся в журнале» возникнет на следующем шаге, на котором я применю логарифм для обеих осей (Log_f и Log_Welch).

Именно здесь возникает проблема для последней строки plt.графика кода. Похоже, что после предыдущего шага использования метода Уэлча и применения логарифма для обеих осей «осталось» другое количество числовых значений для «f» и «Welch».

Интересно, есть ли возможность работать со значениями 0.xxx, указанными в файле .txt. В настоящее время используются только значения выше 0,00000000000001 как для f, так и для Welch. Это приведет к различному количеству значений для x и y, что, следовательно, приведет к невозможности построения данных.

Каким может быть решение этой проблемы?

Комментарии:

1. Вам все равно, какое значение имеет Уэлч, вы просто хотите исключить f=0. BypassZeroW = Welch[f gt; 1e-10]; BypassZerof = f[f gt; 1e-10] Обратите внимание на порядок…

2. Кроме того, вы можете захотеть сделать plt.loglog(f, Welch) , а не брать журнал , и вы почти наверняка захотите log10 , а не log хотите ….

3. Благодарим вас за предоставление решения, а также дополнительной информации. Это работает.

Ответ №1:

Как вы указали, сообщение об ошибке указывает на то, что ваши два массива имеют разную длину. Это связано с тем, что маска второго массива должна совпадать с маской первого. Поэтому замена BypassZero2 = Welch[Welch gt; 0.00000000000001] на BypassZero2 = Welch[f gt; 0.00000000000001] должна устранить проблему.

Комментарии:

1. Спасибо тебе, Дженн. Это решение также отлично работает!