[英]Ways to convert cartesian indexing to matrix indexing as in numpy.meshgrid
[英]Numpy indexing of large meshgrid
我想有一種方法來索引一個 d 維numpy
網格:
舉個例子:
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 循環遍歷所有可能的塊,並對x
、 y
和z
arrays 進行切片以產生一塊網格網格(例如np.meshgrid(x[xChunkId:xChunkId+xChunkSize], y[yChunkId:yChunkId+yChunkSize], z[zChunkId:zChunkId+zChunkSize], indexing='ij')
)。 由於 CPU 緩存(假設塊足夠小以適合緩存),這種方法通常會加快計算可以放入 RAM 中的巨大數組。 只要塊足夠大,循環就不會引入顯着的開銷。
請注意,生成如此巨大的(臨時)數組甚至可能不是強制性的。 事實上,像Numba或Cython這樣的工具可以幫助您在網格上進行迭代,而無需像這樣生成臨時數組。 這需要更少的 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.