web-dev-qa-db-ja.com

Python:配列内の要素の位置を見つける

最高気温と最低気温、気象ステーションの降水量、経度と緯度などの気象データを含むCSVがあります。データの各カテゴリは単一の列に格納されます。

最高温度と最低温度の場所を見つけたい。最大値または最小値を見つけるのは簡単です:numpy.min(my_temperatures_column)

最小値または最大値がある場所の位置を見つけるにはどうすればよいですか?緯度と経度を見つけることができますか?

私の試みは次のとおりです。

def coldest_location(data):

coldest_temp= numpy.min(mean_temp)

    for i in mean_temp:
         if mean_temp[i] == -24.6:
            print i

エラー:リストのインデックスは整数である必要があります

CSVの各列を変数に保存したので、それらはすべて個別のリストです。

lat          = [row[0] for row in weather_data]  # latitude
long         = [row[1] for row in weather_data]  # longitude
mean_temp    = [row[2] for row in weather_data]  # mean temperature 

提案list.index(x)に従って問題を解決しました

mean_temp.index(coldest_temp) 

coldest_location=[long[5],lat[5]] 

質問内の2番目の質問をすることが適切かどうかはわかりませんが、同じ最低温度の場所が2つある場合はどうでしょうか。両方とそのインデックスを見つけるにはどうすればよいですか?

26
julesjanker

Pythonリストの .index(value) メソッドの使用について考えたことはありますか?渡されたvalueの最初のインスタンスが見つかったリストのインデックスを返します。

56
Aaron

データを実際に見ることなく、特定のケースで最大値と最小値の場所を見つける方法を言うことは困難ですが、一般に、次のように場所を検索できます。これは、以下の簡単な例です。

In [9]: a=np.array([5,1,2,3,10,4])

In [10]: np.where(a == a.min())
Out[10]: (array([1]),)

In [11]: np.where(a == a.max())
Out[11]: (array([4]),)

または、次のようにすることもできます。

In [19]: a=np.array([5,1,2,3,10,4])

In [20]: a.argmin()
Out[20]: 1

In [21]: a.argmax()
Out[21]: 4
13
Marcin

Aaronが述べているように、.index(value)を使用できますが、valueが存在しない場合は例外がスローされるため、決して起こらないと確信していても、そのケースを処理する必要があります。いくつかのオプションは、最初にその存在をチェックすることです:

if value in my_list:
    value_index = my_list.index(value)

または、次のように例外をキャッチします。

try:
    value_index = my_list.index(value)
except:
    value_index = -1

適切なエラー処理で間違いを犯すことはありません。

8
Gary02127

やったほうがいい:

try:
    value_index = my_list.index(value)
except:
    value_index = -1;
3
sudhakar

これを行うための組み込みメソッドがあります。

numpy.where()

詳細については 優秀な詳細ドキュメント をご覧ください。

2
lkolololol

変数mean_tempには既に値がロードされており、nX1ディメンション(つまり、1行のみ)であると仮定します。目的を達成するために、次のことができます。

変数のデータ型を変更します。

def coldest_location(data):

    mean_temp = numpy.mat(mean_temp) #data is now matrix type
    min_index = numpy.nonzero(mean_temp == mean_temp.min())  # this returns list of indexes
    print mean_temp[min_index[0],min_index[1]] # printing minimum value, i.e -24.6 in you data i believe
0
Nishant Dixit

リストが次のようなオブジェクトのコレクションである場合:

obj =  [
        {

            "subjectId" : "577a54c09c57916109142248", 
            "evaluableMaterialCount" : 0, 
            "subjectName" : "ASP.net"

        }, 
        {

            "subjectId" : "56645cd63c43a07b61c2c650", 
            "subjectName" : ".NET",         
        }, 
        {

            "subjectId" : "5656a2ec3c43a07b61c2bd83", 
            "subjectName" : "Python",

        }, 
        {

            "subjectId" : "5662add93c43a07b61c2c58c", 
            "subjectName" : "HTML"
        }
    ]

次の方法を使用して、インデックスを見つけることができます。 subjectIdが5662add93c43a07b61c2c58cであり、リスト内のオブジェクトのインデックスを取得するとします。

subjectId = "5662add93c43a07b61c2c58c"

for i, subjobj in enumerate(obj):
    if(subjectId == subjobj['subjectId']):
        print(i)
0
Haris Np

最初の質問では、次のようにindex()を使用して、リスト内のvalueの位置を見つけますx

x.index(value)

2番目の質問では、複数の同じ値を確認するには、リストをチャンクに分割し、上記と同じロジックを使用する必要があります。彼らは分裂と征服を言います。できます。これを試して:

value = 1 
x = [1,2,3,4,5,6,2,1,4,5,6]

chunk_a = x[:int(len(x)/2)] # get the first half of x 
chunk_b = x[int(len(x)/2):] # get the rest half of x

print(chunk_a.index(value))
print(chunk_b.index(value))

お役に立てば幸いです!

0
喬治扎菲