ValueError:x 和 y 必须具有相同的第一维,但具有形状
Posted
技术标签:
【中文标题】ValueError:x 和 y 必须具有相同的第一维,但具有形状【英文标题】:ValueError: x and y must have same first dimension, but have shapes 【发布时间】:2022-01-09 01:04:48 【问题描述】:我想知道如何在我的脚本中最好地解决以下问题:“ValueError: x and y must have the same first dimension, but have shapes (1531,) and (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 > 0.00000000000001] # Avoids "RuntimeWarning: divide by zero encountered in log"
BypassZero2 = Welch[Welch > 0.00000000000001]
Log_f = np.log(BypassZero1, out=BypassZero1, where=BypassZero1 > 0)
Log_Welch = np.log(BypassZero2, out=BypassZero2, where=BypassZero2 > 0)
plt.plot(Log_f, Log_Welch)
代码行“BypassZero1”和“BypassZero2”告诉 Python 仅对“f”和“Welch”使用大于 0.00000000000001 的值。否则,在我对两个轴(Log_f 和 Log_Welch)应用对数的后续步骤中,将出现问题“RuntimeWarning:在日志中除以零”。
这是代码的最后 plt.plot 行出现问题的地方。在使用 Welch 方法并对两个轴应用对数的上一步之后,“f”和“Welch”似乎“剩余”了不同数量的数值。
我想知道是否有可能处理 .txt 文件中提供的 0.xxx 值。目前,对于 f 和 Welch,仅使用高于 0.00000000000001 的值。这将导致 x 和 y 的值数量不同,从而导致无法绘制数据。
有什么办法可以解决这个问题?
【问题讨论】:
你不关心Welch的值是多少,你只想排除f=0。BypassZeroW = Welch[f > 1e-10]; BypassZerof = f[f > 1e-10]
注意顺序...
另外,你可能想要plt.loglog(f, Welch)
而不是记录日志,而且你几乎肯定想要log10
,而不是log
....
感谢您提供解决方案以及其他信息。它有效。
【参考方案1】:
正如您所指出的,错误消息表明您的两个数组的长度不同。这是因为第二个数组的掩码应该与第一个数组的掩码相同。因此,将BypassZero2 = Welch[Welch > 0.00000000000001]
替换为BypassZero2 = Welch[f > 0.00000000000001]
应该可以解决此问题。
【讨论】:
谢谢你,简。这个解决方案也很好用!以上是关于ValueError:x 和 y 必须具有相同的第一维,但具有形状的主要内容,如果未能解决你的问题,请参考以下文章
如何在此 python 代码中获取集群图? ValueError:x 和 y 必须具有相同的第一维
ValueError:尝试绘制 SVM 时 x 和 y 的大小必须相同