Python 如何以字典的方式逐项比较两个2D数组?
我知道如何通过第一项、第二项等来比较两个数组。例如Python 如何以字典的方式逐项比较两个2D数组?,python,arrays,algorithm,numpy,comparison,Python,Arrays,Algorithm,Numpy,Comparison,我知道如何通过第一项、第二项等来比较两个数组。例如[2 3 10 9 6-1]高于[2 3 2 10-1-1]。我需要一种矢量化的方式,可以与两个2D阵列一起工作,如下所示: a = [[ 1 3 10 9 6 -1] [ 5 12 6 5 4 3] [ 2 9 5 6 -1 -1] [ 2 9 4 8 -1 -1] [ 1 5 12 11 9 -1] [ 0 12 9 6 5 3] [ 4 9 -1 -1 -1 -1] [ 1 5 9
[2 3 10 9 6-1]
高于[2 3 2 10-1-1]
。我需要一种矢量化的方式,可以与两个2D阵列一起工作,如下所示:
a = [[ 1 3 10 9 6 -1]
[ 5 12 6 5 4 3]
[ 2 9 5 6 -1 -1]
[ 2 9 4 8 -1 -1]
[ 1 5 12 11 9 -1]
[ 0 12 9 6 5 3]
[ 4 9 -1 -1 -1 -1]
[ 1 5 9 6 2 -1]
[ 2 9 5 12 -1 -1]
[ 1 8 11 9 5 -1]]
反对
b = [[ 2 3 2 10 -1 -1]
[ 1 3 12 6 4 -1]
[ 0 10 9 7 6 5]
[ 2 6 4 12 -1 -1]
[ 1 6 12 11 10 -1]
[ 1 3 12 8 6 -1]
[ 4 9 -1 -1 -1 -1]
[ 0 12 6 5 4 2]
[ 0 12 10 9 6 5]
[ 1 8 11 9 5 -1]]
如何获取第一个数组中赢、输或平局的项目的索引?预期产出为:
{'win': [1, 2, 3, 7, 8],
'lose': [0, 4, 5],
'tie': [6, 9]}
幸运的是,我能够实现一种按预期工作的方法:
def lexcompare(a, b):
diff = a - b
rows, cols = np.where(diff!=0)
idx = np.r_[True, np.diff(rows).astype(bool)]
checks = diff[rows[idx], cols[idx]] > 0
wins, loses = rows[idx][checks], rows[idx][~checks]
tie = np.setdiff1d(np.arange(len(diff)), rows[idx])
return {'win': wins, 'lose': loses, 'tie': tie}
输出:
{'win': array([1, 2, 3, 7, 8], dtype=int64),
'lose': array([0, 4, 5], dtype=int64),
'tie': array([6, 9])}
即使它可能不是很numpy esk,一个简单的手动行比较也能很好地实现这一点:
将numpy导入为np
定义公司法(a:np.ndarray,b:np.ndarray)->条款:
d={'win':[],'tie':[],'lose':[]}
对于枚举(zip(a,b))中的i(a_i,b_i):
对于a_ij,b_ij in-zip(a_i,b_i):
如果a_ij>b_ij:
d['win'].附加(i)
打破
如果b_ij>a_ij:
d['lose'].追加(i)
打破
其他:
d['tie'].附加(i)
返回d
a=np.asarray([
[1, 3, 10, 9, 6, -1],
[5, 12, 6, 5, 4, 3],
[2, 9, 5, 6, -1, -1],
[2, 9, 4, 8, -1, -1],
[1, 5, 12, 11, 9, -1],
[0, 12, 9, 6, 5, 3],
[4, 9, -1, -1, -1, -1],
[1, 5, 9, 6, 2, -1],
[2, 9, 5, 12, -1, -1],
[1, 8, 11, 9, 5, -1]
])
b=np.A阵列([
[2, 3, 2, 10, -1, -1],
[1, 3, 12, 6, 4, -1],
[0, 10, 9, 7, 6, 5],
[2, 6, 4, 12, -1, -1],
[1, 6, 12, 11, 10, -1],
[1, 3, 12, 8, 6, -1],
[4, 9, -1, -1, -1, -1],
[0, 12, 6, 5, 4, 2],
[0, 12, 10, 9, 6, 5],
[1, 8, 11, 9, 5, -1]
])
结果=lex_comp(a,b)#{'win':[1,2,3,7,8],'tie':[6,9],'lose':[0,4,5]}
javascript中的代码可以帮助您吗?它有一个numpy标记,专门将我的问题与Python联系起来。在这种情况下,我将编辑我的标记。我已经有了一个解决方案,这是一个自愿的共享。为什么你要写这么复杂的东西,而每行的线性遍历可以做到这一点呢?那么写你自己的解决方案;)lex_comp
比lexcompare
慢4倍。这就是为什么我要寻找一个向量化的解决方案(for
循环很慢)。这取决于输入矩阵的维数(N,K),但是的,我也测试过了。如果K大,lex_comp
相比性能更好-如果N大,lexcompare
性能更好。