如何使用 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
的方差的数组。然后我们将两个结果绘制在一起以证明它们做同样的事情:
如您所见,这两种方法给出的结果完全相同。
我正在尝试绘制差分数组与常量的方差。通过等式,这就是我要绘制的
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
的方差的数组。然后我们将两个结果绘制在一起以证明它们做同样的事情:
如您所见,这两种方法给出的结果完全相同。