Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何以字典的方式逐项比较两个2D数组?_Python_Arrays_Algorithm_Numpy_Comparison - Fatal编程技术网

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
性能更好。