数组列表:如何查看一个列表中的数组是否在另一个列表中?

时间:2016-12-04 04:11:09

标签: python arrays python-3.x numpy multidimensional-array

如果我有两个包含多维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()

1 个答案:

答案 0 :(得分:0)

使用numpy运算符[1 2 3]比较[1 2 1]eq两个==数组会返回ndarray对应于{[True True False]的布尔值1}}在这种情况下。

因此,if .. in ..语句理解您是希望all元素相等还是只需any(一),这将是不明确的。

我建议手动检查:

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)