2016-12-04 29 views
3

多次元のNumpy配列を含む2つのリストがある場合、リスト内の配列が他のリストにあるかどうかをどのように確認できますか?配列のリスト:あるリストの配列が別のリストにあるかどうかを確認するにはどうすればいいですか?

私は要素が含まれ、どちらも二つのリストを持っている場合は、私はそうのように、それは第二のリストにあるかどうかを判断するために、1つのリスト(要素ごとの)を介して検索することができます。

all_numbers = [1,2,3,4,5,6,7,8,9,10] 
even_numbers = [2,4,6,8,10] 

for i in all_numbers: 
    if i in even_numbers: 
     print(i,'is an even number.') 
    else: 
     print(i,'is an odd number.') 

出力:私は多次元配列を含んでどちらの二つのリストを持っている場合は、1つのリスト内の配列は、同じ方法を使用して他にある場合

1 is an odd number. 
2 is an even number. 
3 is an odd number. 
4 is an even number. 
5 is an odd number. 
6 is an even number. 
7 is an odd number. 
8 is an even number. 
9 is an odd number. 
10 is an even number. 

は今、なぜ私は検索できないのですか?配列はすべて多次元であり、データファイル(urllibおよびnumpyモジュールを使用)から生成されます。私が理解する限り、リスト内の配列は単純な要素なので、同じメソッドを使用すると同じ結果が得られます。しかし、プログラムを実行しようとすると、次のメッセージが表示されます。

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

なぜこのようなことが起こりますか?明らかに、多次元配列を使うことはリストの単純な要素と同じではありません。 1つのリストの配列が別のリストにあるかどうかを確認する方法がありますか?


[以下は私のプログラムの例です。私は多次元配列であるいくつかのデータファイルを使用しています。プログラムの一般性を維持するために、私は実際のURLを削除しました。データファイルは、1981年から1990年までの年単位で整理されているため、閏年を除いて、ファイルの情報量は同じで、余分な1日分のデータが含まれています。私の2つのリストは、すべてのファイルを持つものと、うるう年のファイルを持つものです。 。必要とされている他の情報がある場合は私に知らせてください]

import numpy as np 
import urllib.request 

data1981url = '1981url' 
data1981 = np.genfromtxt(data1981url) 
data1982url = '1982url' 
data1982 = np.genfromtxt(data1982url) 
data1983url = '1983url' 
data1983 = np.genfromtxt(data1983url) 
data1984url = '1984url' 
data1984 = np.genfromtxt(data1984url) 
data1985url = '1985url' 
data1985 = np.genfromtxt(data1985url) 
data1986url = '1986url' 
data1986 = np.genfromtxt(data1986url) 
data1987url = '1987url' 
data1987 = np.genfromtxt(data1987url) 
data1988url = '1988url' 
data1988 = np.genfromtxt(data1988url) 
data1989url = '1989url' 
data1989 = np.genfromtxt(data1989url) 
data1990url = '1990url' 
data1990 = np.genfromtxt(data1990url) 

years = [data1981, data1982, data1983, data1984, data1985, data1986, data1987, data1988, 
data1989, data1990] 
leapyears = [data1984, data1988] 

years_by_day = [] 
flux_data = [] 
for i in years: 
    y = i[:,46] 
    for k in y: 
     flux_data.append(k) 
    if i in leapyears: # Where the problem arises. 
     x = i[0,0] + np.arange(len(y))/105480 
     for j in x: 
      years_by_day.append(j) 
    else: 
     x = i[0,0] + np.arange(len(y))/105120 
     for j in x: 
      years_by_day.append(j) 

出力:ブール値のndarrayを返し==eq演算子を使用して[1 2 3][1 2 1]のような2つのnumpyの配列を比較すると

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
+0

印刷 'kは、私はブール値の配列であると確信しています。これは 'if'では使用できません。一般に、配列をテストするときに 'in'は動作しません。 – hpaulj

+0

これが役立つかどうかを確認する - http://stackoverflow.com/questions/38674027/find-the-row-indexes-of-several-values-in-a-numpy-array – Divakar

答えて

0

この場合は[True True False]に相当します。

したがって、if .. in ..ステートメントでは、allの要素を等価にするか、またはany(1つ)にするかを曖昧にします。

私は手動でチェックしているお勧め:y`で

i_in_leapyears = False 
for ly in leapyears: 
    if (ly == i).all(): # this requires all the array elements to be equal 
     i_in_leapyears = True 
     break 

if i_in_leapyears: 
     x = i[0,0] + np.arange(len(y))/105480 
     for j in x: 
      years_by_day.append(j) 
    else: 
     x = i[0,0] + np.arange(len(y))/105120 
     for j in x: 
      years_by_day.append(j) 
関連する問題