2017-05-16 61 views
2

我想從數組x中取兩個最小值。但是當我使用np.where如何從numpy數組中獲取兩個最小值

A,B = np.where(x == x.min())[0:1] 

我得到這個錯誤:

ValueError: need more than 1 value to unpack

我怎樣才能解決這個問題?我需要在數組中以升序排列一個數字嗎?

+1

好, '[0:1]'分割語法等於'[:1]'語法,這意味着從該數組中獲取第一個元素。你爲什麼不做'A,B = [np.where(x == x.min())] * 2'(解包列表)?你真的不需要切片語法,因爲在給定的序列中只有*一個*最小值。 – blacksite

+0

你想要數組中最小值或最小兩個值的**索引**嗎?你可以包括一個最小的樣本,並展示結果應該是什麼樣子? – MSeifert

+0

@MSeifert我想要數組中的兩個最小值。 – qasim

回答

1

您可以使用numpy.partition獲得最低k+1項目:

A, B = np.partition(x, 1)[0:2] # k=1, so the first two are the smallest items 

在Python 3.x中,你也可以使用:

例如:

import numpy as np 
x = np.array([5, 3, 1, 2, 6]) 
A, B = np.partition(x, 1)[0:2] 
print(A) # 1 
print(B) # 2 
0

如何使用sorted而不是np.where

A,B = sorted(x)[:2] 
+1

似乎每個人都在閱讀這個問題,包括我自己和@MSeifert。 1)分區比分類更有效率。 2)OP正在尋找多次出現相同的值。 –

1

代碼中有兩個錯誤。第一個是切片是[0:1],應該是[0:2]。第二個實際上是np.where的一個非常常見的問題。如果您查看the documentation,您會看到它總是返回一個元組,如果只傳遞一個參數,則返回一個元素。因此,你必須先索引陣列正常訪問元組元素:

A,B = np.where(x == x.min())[0][0:2] 

這將給你包含最小值的兩個第一索引。如果沒有兩個這樣的指數存在,你會得到一個例外,所以你可能想檢查。

+0

@ MSeifert是的,好吧,我認爲這是預期的,儘管我猜它可能會被檢查。順便說一句,我把這個問題理解爲「給我兩個最小值的指數」,雖然也許是「給我兩個最小值」? – jdehesa

+2

對不起,你是對的。它應該給我兩個最小的值。但是「not_a_robot」說:給定序列中只有一個最小值。我很困惑。 – qasim

相關問題