如果你有SciPy的,你可以調用scipy.stats.binned_statistic:
import scipy.stats as stats
statistic, bin_edges, binnumber = stats.binned_statistic(
x=X, values=Y, statistic='median', bins=bins)
statistic = statistic[np.isfinite(statistic)]
print(statistic)
產生
[ 15. 90. 50. 55. 40. 60.]
沒有SciPy的,我想你會需要一個列表理解。 正如您所建議的那樣,您可以通過過濾掉那些空的垃圾箱來避免RuntimeWarning。你可以做到這一點與在列表解析裏的if-condition
:
masks = [(digitized == j) for j in range(1, len(bins))]
bin_medians = [np.median(Y[mask]) for mask in masks if mask.any()]
另外請注意,您所看到的錯誤消息是警告,也不例外。你可以(或者)取消錯誤消息
import warnings
warnings.filterwarnings("ignore", 'Mean of empty slice.')
warnings.filterwarnings("ignore", 'invalid value encountered in double_scalar')
有一種方法可以更快地計算bin_centers:
bin_centers = []
for j in range(len(bins) - 1):
bin_centers.append((bins[j] + bins[j + 1])/2.)
可以簡化爲
bin_centers = bins[:-1] + (bins[1]-bins[0])/2
因此,例如,
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore", 'Mean of empty slice.')
warnings.filterwarnings("ignore", 'invalid value encountered in double_scalar')
np.random.seed(123)
X = np.random.random(10)
bins = np.linspace(min(X), max(X), 10)
digitized = np.digitize(X, bins)-1
bin_centers = bins + (bins[1]-bins[0])/2
Y = range(0, 100, 10)
Y = np.asarray(Y, dtype='float')
bin_medians = [np.median(Y[digitized == j]) for j in range(len(bins))]
print(bin_medians)
plt.scatter(bin_centers, bin_medians)
plt.show()
產生
[15.0, 90.0, 50.0, 55.0, nan, 40.0, nan, nan, nan, 60.0]
![enter image description here](https://i.stack.imgur.com/Tl6du.png)
如果你的目的只是讓散點圖,那麼就沒有必要刪除的NaN,因爲matplotlib
反正會忽略它們。
如果你真的要刪除的NaN,那麼你可以使用
no_nans = np.isfinite(bin_medians)
bin_medians = bin_medians[no_nans]
bin_centers = bin_centers[no_nans]
在上面,我選擇了使用warnings.filterwarnings
只是抑制警告。如果你不希望禁止警告,寧可從bin_medians
過濾NaN,並且從相應的位置從bin_centers
,則:
bin_centers = bins + (bins[1]-bins[0])/2
masks = [(digitized == j) for j in range(len(bins))]
bin_centers, bin_medians = zip(*[(center, np.median(Y[mask]))
for center, mask in zip(bin_centers, masks)
if mask.any()])
這到底是怎麼回事?什麼是「X」和「Y」? 「X」中的值與「Y」中的值相對應? –
它們包含的數字基本上是任意的,只要每個數字x屬於一個數值y,所以有成對(x1,y1),(x2,y2)等等。在我的情況下,X包含大小,Y包含每個x值的大小偏差。繪製出一個X/Y散點圖。 – frixhax