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: x 和 y 的大小必须相同

ValueError:尝试绘制 SVM 时 x 和 y 的大小必须相同

ValueError:在Python中创建KMeans模型时x和y的大小必须相同

matplotlib 错误:x 和 y 的大小必须相同

Dash Plotly 如何修复“所有参数应具有相同的长度。x 和 y”