我有两个列表a& b,长度N相等,值在[0,1]之间。我想检查具有相同索引的两个列表中的每一对(a [0]与b [0],a [1]与b [1]等等)并根据它们的值,测量属于的次数配对以下状态之一。
列表中的每个元素都可以处于以下状态之一:
1)[0]
2)(0,0.1)
3)(0.1,0.2)
.....
11)(0.9,1)
12)[1]
我的问题是a或b的每个元素都可以处于这12个状态中的一个状态,因此它们的对有可能处于12 * 12 = 144个最终状态之一。
配对状态< - 状态a&国家b
最终状态1< -State 1&州1
最终状态2< -State 1&州2
最终状态3< -State 1&国家3
...
最终国家144< - State 12&国家12
如果我只有一个列表,则可以使用简单的for循环和if / else语句解决问题。我压缩了两个列表,但随后组合太多而无法继续。
有什么想法吗?
如果我有一个例子:
a = [0,0.1,0.25,0.1]
b = [1,0.1,0.4,0.05]
有144个已定义的可能状态对,所以从上面的4个我们有
州1&状态12 = 1(来自[0] -b [0])
州2&状态2 = 2(来自[1] -b [1]和[3] -b [3])
州4&状态5 = 1(来自[2] -b [2])
答案 0 :(得分:2)
如果我做对了,给出你的两个清单,你需要找出有多少"对"包含来自相同间隔的项目。
这是您可以使用的一个小技巧:
乘以10,然后使用int()
去除小数部分。
a = [.11, .22, .33, .55]
b = [.16, .28, .38, .60]
pairs = 0
for (x, y) in zip(a, b):
if int(x*10) == int(y*10):
pairs += 1
print(pairs)
如果零本身就是一个状态,那么您需要调整我上面发布的内容来解释这一点,因为int(0*10)
和int(0,09*10)
会得到完全相同的结果。
对问题的编辑:如果你有一个"矩阵"国家,那么实际上可能有一个简单的方法。
w = 12
states = [[0 for x in range(w)] for y in range(w)] # Beware of [[0]*12]*12, that doesn't work
for (x, y) in zip(a, b):
sx = int(x*10)
sy = int(y*10)
if (x != 0):
sx +=1
if (y != 0):
sy += 1
states[sx][sy] += 1
这会创建一个12 * 12的表,并且对于每一对,递增"单元格"它属于。从那里,你需要提取对的数量,并用适当的"状态x +状态y"前缀它们。标签。
最后注意事项:如果要将结果输出到控制台,则可能需要使用pprint
模块。
答案 1 :(得分:0)
对于numpy版本,没有显式循环的类似机器。
import numpy as np
a = [.11, .22, .33, .55]
b = [.16, .28, .38, .60]
Ind = (10*np.array([a,b])).astype(int)
State_mat = np.zeros((12,12),dtype=int)
State_mat[Ind[0],Ind[1]] = 1
State_mat.tolist()
给出相同的输出