2015-01-26 63 views
2

晚上好,包含可變大小物體(物體陣列)的Numpy ndarray

我目前正在進行第一年大學項目,以模擬連續滲流。這涉及在n維空間中隨機分佈一些盤/球/超球體在正方形/立方體/超立方體上,並找到跨越邊界的連接粒子羣。爲了加速所有這些粒子之間的本質碰撞檢測,將它們分組爲相互連接的簇,我決定使用空間分區,以便我的程序可以很好地與粒子數量成正比。這要求我將n維空間與均勻大小的盒子/立方體/超立方體分開,並將粒子放置在相關盒子內,以便可以進行優化的碰撞檢查,這需要較少的比較,因爲只有位於相鄰盒子/立方體/超立方體中的粒子到需要檢查新粒子的位置。所有的細節已經算出來了。

但是,使用具有與正在研究的空間相等的「維度」的ndarray似乎是個好主意。然後,ndarray中的每個「點」本身都會包含一組粒子對象。很容易查看ndarray中圍繞新粒子座標的對象,並循環遍歷包含其他粒子的數組,這些對象包含必須進行檢查的其他粒子。然後我發現ndarray只能包含固定大小的對象,這些粒子數組並不是因爲它們會隨着粒子隨機添加到系統中而增長。

陣列(等..)陣列的正常numpy數組是唯一的解決方案或做結構類似於ndarray,但能夠容納可變大小的對象存在嗎? Ndarray看起來很棒,因爲它是用編譯語言c編寫的numpy的一部分,所以它會很快。此外,ndarray不會要求和循環構造,因爲我相信陣列數組(陣列等)會(注意:空間的維度和空間分割的增量不是恆定的,因爲可以添加不同半徑的粒子,這意味着空間劃分方塊/立方體/超立方體的大小的改變)。

速度在這個程序中是非常重要的,看到我發現算法良好的優化會被糟糕的實現所破壞!

+0

你可以製作一個'object'的ndarray,然後你可以用它填充它,例如:列表或任何其他對象。您失去了使用ndarray的一些速度優勢,但仍然具有多維切片等等。 .nonzero()方法特別有用。 – greggo 2015-01-26 20:38:00

+0

這聽起來像你想沿着[K-d樹]的行更多的東西(http://en.wikipedia.org/wiki/K-d_tree)。最近鄰上K-d樹搜索是* O(日誌(N))* – 2015-01-26 21:00:54

+0

'numpy'陣列用'D型= object'鬆動大多數傳統的數字'numpy'陣列的速度的優點。它們比列表的Python列表更好。 – hpaulj 2015-01-26 22:48:05

回答

3

您是否考慮過使用kd-tree? kd-trees支持通過分割空間來快速枚舉一個點的鄰居(很像你對多維數組提供的建議)。

作爲一個不錯的獎金,還有已經在SciPy的,同伴項目NumPy的體面kd樹實現:scipy.spatial.KDTree