簡體   English   中英

Numpy 索引大meshgrid

[英]Numpy indexing of large meshgrid

我想有一種方法來索引一個 d 維numpy網格:

  • 沒有在 memory 中實際存儲完整的密集網格網格
  • 它支持全密集網格支持的所有索引類型

舉個例子:

x = np.random.randn(Nx)
y = np.random.randn(Ny)
z = np.random.randn(Nz)

x_g, y_g, z_g = np.meshgrid(x, y, z, indexing='ij')
X = np.concatenate([x_g[..., None], y_g[..., None], z_g[..., None]], axis=-1)

一旦我有了X ,我就可以使用numpy的所有索引方法,例如:

X[10:20,1:9:3,:]

X[(
    [0, 1, 3, 5],
    [1, 1, 3, 3],
    [2, 7, 8, 9]
    )]

在某些情況下,產品Nx * Ny * Nz太大而無法放入 memory (例如Nx = Ny = Nz = 4000 ),但我希望能夠使用索引取出我的多維數據集。

有沒有一種方法可以在不重新編碼 numpy 的索引邏輯的情況下實現這一目標? 3d 中的答案如下所示:

def meshgrid_index(x, y, z, index):
    # index is the argument normally passed to X.__getitem__
    # should support all types of indexing
    ...

謝謝!

當沒有足夠的 memory 時,解決這個問題的通常方法是逐塊工作。 想法是使用基本的 Python 循環遍歷所有可能的塊,並對xyz arrays 進行切片以產生一塊網格網格(例如np.meshgrid(x[xChunkId:xChunkId+xChunkSize], y[yChunkId:yChunkId+yChunkSize], z[zChunkId:zChunkId+zChunkSize], indexing='ij') )。 由於 CPU 緩存(假設塊足夠小以適合緩存),這種方法通常會加快計算可以放入 RAM 中的巨大數組。 只要塊足夠大,循環就不會引入顯着的開銷。

請注意,生成如此巨大的(臨時)數組甚至可能不是強制性的。 事實上,像NumbaCython這樣的工具可以幫助您在網格上進行迭代,而無需像這樣生成臨時數組。 這需要更少的 memory 並且在實踐中要快得多(由於 CPU 緩存),更不用說這些工具可用於使您的代碼並行運行(假設您的算法可以並行化)。 請注意,這些工具還可以大大降低小塊的循環成本(並且使用小塊通常對性能有好處,同樣是因為 CPU 緩存)。

當由於需要一次計算完整數組而無法做到這一點時,唯一的解決方案是將巨大的 arrays 存儲/加載到存儲設備。 一種快速便捷的方法是使用內存映射 arrays 請注意,這會慢得多(尤其是使用 HDD 時)。

請注意,將此特定數組存儲在存儲設備上效率非常低,因為它包含大量重復值。

為了性能,減小 arrays 的大小至關重要 實際上,默認情況下,您的陣列可能會占用 1.4 TiB 的 memory,而 Numpy 往往會經常創建許多臨時 arrays。 因此,最終所需的存儲容量可以迅速超過 10 TiB。 對於這種用途,HDD 非常慢,而高性能 SSD/持久內存非常昂貴。 處理較小的類型,如 32 位浮點數或整數(使用dtype參數和astype方法)會有很大幫助。 這不是免費的,盡管這樣做是以降低准確性和可能的溢出為代價的。

暫無
暫無

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

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