簡體   English   中英

如何通過切片范圍有效地索引到1D numpy數組

[英]How to efficiently index into a 1D numpy array via slice ranges

我有一個很大的一維數據陣列。 我在這些數據中有一個starts索引數組,其中發生了重要的事情。 我希望如此,我得到的長度窗口拿到范圍的數組L ,一個在每個起點starts Bogus樣本數據:

data = np.linspace(0,10,50)
starts = np.array([0,10,21])
length = 5

我想本能地做點什么

data[starts:starts+length]

但實際上,我需要將starts轉換為范圍“窗口”的2D數組。 來自函數式語言,我會把它想象成從列表到列表列表的map ,例如:

np.apply_along_axis(lambda i: np.arange(i,i+length), 0, starts)

但這不起作用,因為apply_along_axis只允許標量返回值。

你可以這樣做:

pairs = np.vstack([starts, starts + length]).T
ranges = np.apply_along_axis(lambda p: np.arange(*p), 1, pairs)
data[ranges]

或者你可以用列表理解來做到這一點:

data[np.array([np.arange(i,i+length) for i in starts])]

或者你可以迭代地做。 (的Bleh。)

是否有一種簡潔,慣用的方式在這樣的某些起點切入數組? (原諒這個笨拙的新手。)

data = np.linspace(0,10,50)
starts = np.array([0,10,21])
length = 5

對於NumPy這樣做的唯一方法,您可以使用此處所述的numpy.meshgrid()

http://docs.scipy.org/doc/numpy/reference/generated/numpy.meshgrid.html

正如hpaulj在評論中指出的那樣,這個問題實際上並不需要meshgrid,因為你可以使用數組廣播。

http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

# indices = sum(np.meshgrid(np.arange(length), starts))

indices = np.arange(length) + starts[:, np.newaxis]
# array([[ 0,  1,  2,  3,  4],
#        [10, 11, 12, 13, 14],
#        [21, 22, 23, 24, 25]])
data[indices]

回報

array([[ 0.        ,  0.20408163,  0.40816327,  0.6122449 ,  0.81632653],
       [ 2.04081633,  2.24489796,  2.44897959,  2.65306122,  2.85714286],
       [ 4.28571429,  4.48979592,  4.69387755,  4.89795918,  5.10204082]])

如果需要花費大量時間,可以使用as_strided()創建一個滑動的windows data數組

data = np.linspace(0,10,50000)
length = 5
starts = np.random.randint(0, len(data)-length, 10000)

from numpy.lib.stride_tricks import as_strided
sliding_window = as_strided(data, (len(data) - length + 1, length), 
                 (data.itemsize, data.itemsize))

然后你可以使用:

sliding_window[starts]

得到你想要的。

它也比創建索引數組更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM