我有兩個陣列:Xand V,我想為每個條目分配一個 bin 值X,然后創建一個矩陣,其行大小為X條目數,列大小為 bin 數。然后我想V根據它們的 bin 列將值映射到矩陣。
我想從以下使用開始np.digitize:
import numpy as np
#Sample arrays
X = np.array([1,3,5,4,5,7,2,4,5])
V = np.array([0.5,0.7,0.29,4.4,13.3,0.9,2.2,2.7,2.5])
#Creating the bin array
grid_max = X.max()
grid_min = X.min()
bin_width = int(3)
bins = np.arange(grid_min, grid_max bin_width, bin_width)
bin_centres = (bins[1:] bins[:-1]) / 2
#Bin number for each X entry
binplace_X = np.digitize(X, bins)
然后創建一個矩陣NaN:
Sort = np.full( (np.shape(X)[0], len(bins)) , np.nan)
Sort我希望為這個案例得到的結果應該是這樣的:
[[0.5, 0.29, 0.9],
[0.7, 4.4, nan],
[2.2, 13.3, nan],
[nan, 2.7, nan],
[nan. 2.5, nan].
[nan, nan, nan],
[nan, nan, nan],
[nan, nan, nan],
[nan, nan, nan]]
我不確定實作這一目標的有效方法是什么。
uj5u.com熱心網友回復:
如果我正確理解了這個問題,你可以試試這個:
import numpy as np
X = np.array([1, 3, 5, 4, 5, 7, 2, 4, 5])
V = np.array([0.5, 0.7, 0.29, 4.4, 13.3, 0.9, 2.2, 2.7, 2.5])
grid_max = X.max()
grid_min = X.min()
bin_width = 3
bins = np.arange(grid_min, grid_max bin_width, bin_width)
binplace_X = np.digitize(X, bins)
Sort = np.full((np.shape(X)[0], len(bins) 1), np.nan)
Sort[np.arange(len(X)), binplace_X] = V
該Sort陣列如下所示:
[[ nan 0.5 nan nan]
[ nan 0.7 nan nan]
[ nan nan 0.29 nan]
[ nan nan 4.4 nan]
[ nan nan 13.3 nan]
[ nan nan nan 0.9 ]
[ nan 2.2 nan nan]
[ nan nan 2.7 nan]
[ nan nan 2.5 nan]]
與您的預期輸出相比,還有一列(因為bins陣列創建了len(bins) 1垃圾箱,而不是len(bins)。此外,在您提供的示例nan中,一行中有幾個非條目。這表明一個數字屬于幾個不同的垃圾箱同時,這是不可能的。上面的陣列nan每行只有一個非條目。另一方面,如果目標是將所有非nan值移動到列的頂部,同時保持它們的相對順序,那么你可以這樣做:
mask = np.isnan(Sort.T)
Sort2 = np.full(Sort.shape, np.nan)
Sort2.T[~np.sort(mask, axis=1)] = Sort.T[~mask]
Sort2 那么如下:
[[ nan 0.5 0.29 0.9 ]
[ nan 0.7 4.4 nan]
[ nan 2.2 13.3 nan]
[ nan nan 2.7 nan]
[ nan nan 2.5 nan]
[ nan nan nan nan]
[ nan nan nan nan]
[ nan nan nan nan]
[ nan nan nan nan]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/359776.html
下一篇:Pandas:根據列名重新排序列
