如果我有两个列表,两个列表都包含多维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.
如果我有两个列表,两个列表都只包含多维数组,为什么我不能使用相同的方法搜索一个列表中的数组是否在另一个列表中?数组都是多维的,由数据文件生成(使用
urllib
和numpy
模块)。据我所知,列表中的数组只是元素,因此使用相同的方法应该会产生相同的结果;但是,当我尝试执行程序时,会得到以下消息: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()
最佳答案
在本例中,使用numpy
运算符[1 2 3]
比较[1 2 1]
和eq
这两个==
数组将返回与ndarray
对应的布尔值[True True False]
。
因此,对于if .. in ..
语句来说,要理解元素是相等还是仅仅是其中的一个元素是不明确的。
我建议手动检查:
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)
关于python - 数组列表:如何查看一个列表中的数组是否在另一个列表中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40955296/