2016-12-04 173 views
3

如果我有两个列表,其中都包含多维Numpy数组,我怎么能看到一个列表中的数组是否在另一个列表中?数组列表:如何查看一个列表中的数组是否在另一个列表中?

如果我有两个列表,两者均含有的元素,我可以通过一个列表(元件逐元​​素)搜索,以确定它是否是在第二列表中,像这样:

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 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. 

现在,如果我有两个列表,两者仅包含多维数组,为什么我不能搜索,如果在一个列表中的阵列中的其他使用相同的方法?这些阵列都是多维的,并且由数据文件生成(使用urllibnumpy模块)。据我所知,列表中的数组只是元素,所以使用相同的方法应该会得到相同的结果;然而,当我尝试执行我的程序时,我收到以下消息:

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

为什么会发生这种情况?显然,使用多维数组并不等同于列表中的简单元素。有没有办法实现我想要的(即查看一个列表中的数组是否在另一个列表中)?


[以下是我的程序示例。我正在使用几个数据文件,所有这些文件都是多维数组。为了保持程序一般,我已经删除了实际的URL。数据文件按年份(从1981-1990)组织,所以文件具有相同数量的信息,闰年除外,这些数据有额外一天的数据。我的两个列表是拥有所有文件的列表,还有一个列有闰年文件的列表。请让我知道,如果有是所需要的任何其他信息]

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) 

输出:

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

比较喜欢[1 2 3][1 2 1] 2个numpy阵列使用eq操作==返回布尔值的ndarray在这种情况下对应于[True True False]

所以,这将是暧昧的if .. in ..声明以了解是否要all元素等于或只是any(一个)人。

我的建议是手动检查:在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) 
相关问题