我想將核密度函式的所有值提取到矩陣(形狀為 ymax,xmax 的 numpy 陣列)。使用 seaborn 繪制核密度非常容易:
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import stats, random
x = random.sample(range(2000, 4500), 1000)
y = random.sample(range(0, 2500), 1000)
sns.kdeplot(x,y)

并且在指定位置提取密度值也很容易:
values = np.array(list(zip(x, y)))
kde = stats.gaussian_kde(values.T)
# Extracting kernel value at [xcoords],[ycoords]
kde([[2500,3700,4500],[500,2000,2500]])
陣列([3.09998436e-07, 4.63280866e-07, 1.56687705e-09])
問題是,如何將所有可能的值提取到矩陣中(給定擴展名)?我想用它做矩陣計算。如果我嘗試使用前面的方法并給它每個像素的坐標,它只是很慢。
#Fast (extracting kernel density value at every 100 xy points)
kernel(np.array(list(
itertools.product(
range(0,1000,100),
range(0,1000,100))
)).T)
# Slow (extracting kernel density value at all possible xy points)
kernel(np.array(list(
itertools.product(
range(0,1000),
range(0,1000))
)).T)
uj5u.com熱心網友回復:
這很慢,因為它itertools.product是一個可迭代物件,它產生數百萬個純 Python 物件(整數和元組),這些物件需要被 Numpy 解碼并轉換為本地整數。您可以直接使用 Numpy 來高效地生成這樣的陣列:
rng = np.arange(1000)
x = np.repeat(rng, 1000)
y = np.tile(rng, 1000)
idx = np.hstack((x[:, None], y[:, None]))
kernel(idx)
在我的機器上生成索引的速度快了 80 倍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/401966.html
上一篇:從緊耦合線和噪聲曲線中尋找直線
