如何使用 matplotlib 绘制变化数组的方差?

How to plot variance of a changing array using matplotlib?

我正在尝试绘制差分数组与常量的方差。通过等式,这就是我要绘制的

diff[n] = arrInput[n] - k*arrInput[n-1]

我需要绘制 diff[n] 与 k 的方差。一般来说,我是 matplotlib 和信号处理的新手,所以我非常坚持这一点。

我所做的是像这样创建和排列:

diff = []
for i in range(1, len(arrInput)): 
    diff.append(arrInput[i] - arrInput[i-1])

但我无法理解如何将 i-1 项与变化的常数相乘并绘制出来。

我确实尝试过使用 np.linspace(0,1) 为 k 创建等距项,如下所示:

k = np.linspace(0,1)

但是当我尝试像这样绘制上面的图时:plt.plot(np.var(dd),k) 我得到以下错误

x and y must have same first dimension, but "have shapes {} and {}".format(x.shape, y.shape

如有任何帮助,我将不胜感激。

编辑 澄清并简而言之: 我想根据方程 diff[n] = arrInput[n] - k*arrInput[n-1].

绘制 (diff[n]) 与 k 的方差图

您需要先告诉 pyplot 您的 x 轴是什么样子,然后再添加 y 坐标。

import matplotlib.pyplot as plt

k_is_constant = True

def calculate_k(i):
    if k_is_constant:
        return 0.1  # this can be any number you like. Maybe check out argparse
    else:
        #provide a function to calculate k from i. here i will alternate between 0 and 1
        return i%2

arrIn = list(range(50))

y = list()

for i in range(1, len(arrIn)):
    y.append(arrIn[i] - calculate_k(i)*arrIn[i-1])

x = list(range(len(y)))

plt.plot(x, y)
plt.show()

如果您希望 k 随程序的不同执行而改变,也许 argparse 就是您所需要的。

对于 k 的每个值,您想绘制 diff(k;n) 相对于其 n 维度的方差,其中 k 本质上是方差计算的持续时间。为此,您只需计算 k 的每个值的差异及其方差,并将它们收集在列表或数组中进行绘图。您可以使用循环手动执行此操作,但您也可以使用广播操作轻松获得我在上面称为“diff(k;n)”的二维数组,并在一次调用中计算 k 的每个值的方差var().

以下是两种方法:

import numpy as np
import matplotlib.pyplot as plt

# dummy data: random arrays for the diff
N = 100  # size of the array for a given k
Nk = 51  # number of "k" values later
arr = np.random.random(N)  # shape (N,)

# pedestrian method: for each k compute the diff and its variance
def weighted_diff_var(arr, k):
    """Compute variance of diff such that diff[n] = arr[n] - k*arr[n-1] for a fixed k"""
    diff = arr[1:] - k * arr[:-1]  # diff[0] = arr[1] - k*arr[0], diff[1] = arr[2] - k*arr[1], etc.
    var = diff.var()
    return var

# advanced method: compute a 2d array of shape (Nk, N) and compute the variance in one go
def weighted_diff_var_vectorized(arr, Nk=Nk):
    """Compute variance in one go for each k using broadcasting and vectorization"""
    all_ks = np.linspace(0, 1, Nk)[:,None]  # shape (Nk, 1) for broadcasting
    all_diffs = arr[1:] - all_ks * arr[:-1]  # broadcast to shape (Nk, N)
    vars_vectorized = all_diffs.var(axis=1)
    return vars_vectorized

all_ks = np.linspace(0, 1, Nk)  # shape (Nk,)
vars_loopy = [weighted_diff_var(arr, k) for k in all_ks]  # or np.array(...); note the loop
vars_vectorized = weighted_diff_var_vectorized(arr)  # shape (Nk,) directly

plt.plot(all_ks, vars_loopy, 'o-', label='loopy')
plt.plot(all_ks, vars_vectorized, 'x-', label='vectorized')
plt.legend()
plt.xlabel('k')
plt.ylabel('var(diff)')
plt.grid(True)

plt.show()

第一个函数 weighted_diff_var 将单个 k 值作为输入并计算 diff,然后根据您的处方计算方差。当然我们需要遍历每个 k 值并调用这个函数,这就是这个列表理解所做的:

vars_loopy = [weighted_diff_var(arr, k) for k in all_ks]

或者,我们可以创建一个维度为“k”和“n”的二维数组,可以这么说,并计算其沿给定轴的方差(“[的轴” =14=]").这就是 weighted_diff_var_vectorized 中发生的情况,其中一次调用将为我们提供一个包含每个 k 的方差的数组。然后我们将两个结果绘制在一起以证明它们做同样的事情:

如您所见,这两种方法给出的结果完全相同。