Python 2.7 在matplotlib中减去两个绘图

Python 2.7 在matplotlib中减去两个绘图,python-2.7,matplotlib,subtraction,Python 2.7,Matplotlib,Subtraction,我想减去两个图,但我遇到了一些错误。我的代码如下所示: 一般而言: 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.

我想减去两个图,但我遇到了一些错误。我的代码如下所示:

一般而言:

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
。我试着用两种方法来做这件事,但我犯了一些错误:

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

  • 错误如下所示:

    回溯(最近一次调用上次):文件 “S:/Doktorat/Python/Data/Dekomp/substruction.py”,第57行,in o=x-x2[:,:4800]索引器错误:数组的索引太多

  • o=x2-x
    o2=y2-y
    plt.符号学(o,o2/dataset.size**0,color='r',label='Bx')

  • 错误如下所示:

    回溯(最近一次调用上次):文件 “S:/Doktorat/Python/Data/Dekomp/substruction.py”,第57行,in o=x2-x ValueError:操作数无法与形状(4595,)(356,)一起广播


    你知道怎么做吗?

    这是一个简单的矩阵问题。因为基本的矩阵运算,如减法和加法,只能在两个矩阵具有相同的维度时执行,而在您的情况下则不是。 这就是错误存在的原因。
    您需要将较大的矩阵更改为较低的维度,以便将两者相减。

    您的
    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()
    
    阵列切片说明

    根据您的代码,您有两个数组(
    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[:,:361]
    减去
    x2
    x
    ,这意味着您将
    x2
    视为一个2d数组,而实际上它是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])
    

    减法很有效,但绘图是空的,我得到这个错误:UserWarning:数据没有正值,因此无法进行对数缩放。“数据没有正值,因此不能是”问题是我不确定要绘制的值是什么,现在的示例将数组的每个值减去自身,从而生成一个无法在日志图中表示的零数组。