2017-01-25 120 views
2

我有一個n值的n維1維陣列,可以稱之爲xdata如何創建多維numpy數組?

我想創建一個多維的numpy數組,我們稱它爲xdataMulti,這樣這個數組的每個維度包含xdata中的某個範圍內的值。

例如可以說

xdata = np.array([-0.879645943,-0.7897614865,-0.7051130178,-0.6108652382,-0.5270894341,...]) 

而且,我希望把xdataMulti[:,0]-0.9-0.6的擴展數據之間的所有值和-0.6之間的所有值和xdataMulti[:,1]0

怎麼辦我創建並填寫了xdataMulti(我事先知道我有多少個範圍以及他們的端點,但我不知道每個範圍有多少個xdata點,我必須通過xdata來查找)?

+1

這算不上什麼numpy的(多)維數組意味着!每個維度中條目的長度應該相同。 – Lagerbaer

+1

您正在描述不同大小的數組列表。 – hpaulj

+0

是的,它是一個不同大小的數組列表。我需要每個都是一個numpy數組,以便調用只接受numpy數組的scipy函數。 – user2175783

回答

2

如果你的範圍的數量不是太大,你可以用手

gm09 = xdata >= -0.9 
gm06 = xdata >= -0.6 
g0 = xdata >= 0 
ranges = [xdata[gm09 & ~gm06], xdata[gm06 & ~g0]] 
result = [f(r) for r in ranges] 

其中f是你SciPy的功能創建它們。

如果您的範圍數很大,您可以對數據進行排序,然後使用 searchsorted。假設你已經塊的邊界數組排序bnd在:

xs = np.sort(xdata) 
xbnd = np.searchsorted(xs, bnd) 
ranges = [xs[l:r] for l, r in zip(xbnd[:-1], xbnd[1:])] 
result = [f(r) for r in ranges] 

注意,這不同於第一解決方案,你的範圍進行排序。

如果您需要保留您可以使用原來的順序排序間接

order = np.argsort(xdata) 
xbnd = np.searchsorted(xdata[order], bnd) 
ordord = [np.sort(order[l:r]) for l, r in zip(xbnd[:-1], xbnd[1:])] 
ranges = [xdata[oo] for oo in ordord] 
result = [f(r) for r in ranges] 
+1

中間代碼* xs = np.sort(xdata) xbnd = np.searchsorted(xs,bnd) 範圍= [xs [l:r]爲l,r爲zip(xbnd [: - 1],xbnd [1:])] result = [f(r)for r in ranges] *想象xbnd是[6,18],那麼zip是[(6,18)],範圍對象將只包含6和18(0到6和18之間,最後沒有被選中)。 – JennyToy

+1

@JennyToy嗯,是不是應該如此?讓xbnd從6開始意味着xdata中的最小六個值在最小倉邊界之下,所以它們不應該存在倉,至少就原Q而言。如果你想收集這些異常值,你總是可以做一些事情,比如xbnd = np.r_ [0,xbnd,len(xdata)] –

1

多維數組必須是矩形的,所以如果不是所有行/列的長度都相同,那麼您運氣不好。

但是有辦法解決這個問題。一種方法是創建arrayslist

>>> arr = np.random.random((10)) # using this for values 

>>> # each item in ranges corresponds to the lower and upper border. 
>>> ranges = [(0, 0.3), (0.3, 0.6), (0.6, 1)] 

>>> [arr[(arr >= lower) & (arr < upper)] for lower, upper in ranges] 
[array([ 0.15346374]), 
array([ 0.38144735, 0.45017858, 0.52710788, 0.36339812]), 
array([ 0.79770651, 0.77543868, 0.94824291, 0.87412998, 0.70890894])] 

這不是一個多維數組,只是一個數組列表,但根據您的需要,可能是不夠的。