我想减去两个图,但是遇到一些错误。我的代码如下:
通常:
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.semilogy(o, o2 / dataset.size ** 0, color='r', label='Bx')
错误看起来像这样:
回溯(最近通话最近):文件 “ S:/Doktorat/Python/Data/Dekomp/substraction.py”,第57行,在 o = x-x2 [:,:4800] IndexError:数组的索引过多
o = x2-x
o2 = y2-y
plt.semilogy(o, o2 / dataset.size ** 0, color='r', label='Bx')
错误看起来像这样:
回溯(最近通话最近):文件 “ S:/Doktorat/Python/Data/Dekomp/substraction.py”,第57行,在 o = x2-x ValueError:操作数不能与形状(4595,)(356,)一起广播
任何想法怎么办?
答案 0 :(得分:1)
您的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()
阵列切片说明
根据您的代码,您有2个数组(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
首先减去x
和x2[:,:361]
,这意味着您实际上认为x2
是2d数组,结果是1d错误。
然后,您尝试做o = x2-x
,但由于x
包含356个值,而x2
包含3595个值,python不知道该怎么做。
例如,如果您想在一个非常简单的示例中将前三个值减去后三个值,则可以执行以下操作:
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])
答案 1 :(得分:0)
其简单矩阵问题。作为基本矩阵运算,例如减法和加法运算只能在两个矩阵具有相同的维数时执行,而您的情况则不同。 这就是错误所在的原因。 您需要将较大的矩阵更改为较小的维度,以便将两者相减。