2012-03-02 50 views
1

獲取最小陣列出來的多個陣列的說,我有4 numpy的陣列 [1,2,3] [2,3,1] [3,2,1] [1,2 3,2]通過順序在Python

在這種情況下,我確定[1,2,3]是我的目的的「最小數組」,因爲它是索引0處最低值的兩個數組之一,兩個數組具有最低的索引1.如果有更多的數組具有相似的值,則需要比較下一個索引值,依此類推。

如何從堆中以同樣的順序提取數組[1,2,3]?

我該如何擴展到x個大小爲n的數組?

由於

回答

3

使用列表(未numpy的陣列)的一個列表中的蟒非numpy的的.sort()或排序()自動執行此例如

a = [[1,2,3],[2,3,1],[3,2,1],[1,3,2]] 
a.sort() 

[[1,2,3],[1,3,2],[2,3,1],[3,2,1]] 

的numpy的排序似乎只子陣遞歸排序,以便它似乎是最好的辦法是首先將它轉換爲一個Python列表。假設你有一個數組的數組,你要挑最小的,你可以得到最低爲

sorted(a.tolist())[0] 

正如有人指出,你也可以做min(a.tolist())它使用相同類型比較的排序,並會更快對於大型數組(線性vs n log n漸近運行時間)。

+0

感謝,排序(a.tolist())[0]是我一直在尋找。乾杯 – Asterick 2012-03-02 18:23:48

+2

如果你可以將一個numpy數組轉換爲列表,你可以通過調用min(l)來獲得。 – jaime 2012-03-02 18:25:33

+1

很好的回答(+1)。但爲了擴大這個範圍,我會補充說排序需要O(nlogn)時間,而你可以使用'min(a.tolist())'來獲得O(n)所需的時間。 – inspectorG4dget 2012-03-02 18:31:01

0

下面是使用numpy的一個想法:

import numpy 

a = numpy.array([[1,2,3],[2,3,1],[3,2,1],[1,3,2]]) 

col = 0 
while a.shape[0] > 1: 
    b = numpy.argmin(a[:,col:], axis=1) 
    a = a[b == numpy.min(b)] 
    col += 1 

print a 

這將檢查逐列,直到只有一行離開了。

0

numpy的lexsort接近你想要的。它首先排序最後一個鍵,但這很容易解決:

>>> a = np.array([[1,2,3],[2,3,1],[3,2,1],[1,3,2]]) 
>>> order = np.lexsort(a[:, ::-1].T) 
>>> order 
array([0, 3, 1, 2]) 
>>> a[order] 
array([[1, 2, 3], 
     [1, 3, 2], 
     [2, 3, 1], 
     [3, 2, 1]])