#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. Спасибо тебе, Дженн. Это решение также отлично работает!