在以下问题中, https://stackoverflow.com/a/40056135/5714445
Numpy的广播提供的解决方案比使用与np.view()配对的np.setdiff1d()快了近6倍。它是如何设法做到的?
使用A[~((A[:,None,:] == B).all(-1)).any(1)]
可以加快速度。
有趣,但提出了另一个问题。这个表现如何更好?
答案 0 :(得分:5)
我会尝试回答问题的第二部分。
所以,我们正在比较:
A[np.all(np.any((A-B[:, None]), axis=2), axis=0)] (I)
和
A[~((A[:,None,:] == B).all(-1)).any(1)]
为了与第一个匹配的视角进行比较,我们可以写下第二种方法 -
A[(((~(A[:,None,:] == B)).any(2))).all(1)] (II)
考虑性能时的主要区别在于,对于第一个,我们通过减法获得非匹配,然后使用.any()
检查非零。因此,any()
用于操作非布尔dtype数组的数组。在第二种方法中,我们正在为它提供一个使用A[:,None,:] == B
获得的布尔数组。
让我们进行一次小型运行时测试,看看.any()
对int
与boolean array
的对象In [141]: A = np.random.randint(0,9,(1000,1000)) # An int array
In [142]: %timeit A.any(0)
1000 loops, best of 3: 1.43 ms per loop
In [143]: A = np.random.randint(0,9,(1000,1000))>5 # A boolean array
In [144]: %timeit A.any(0)
10000 loops, best of 3: 164 µs per loop
的执行情况 -
9x
因此,在此部分接近 any()
加速时,我们发现将var data = google.visualization.arrayToDataTable(array);
var options = {
title: 'Meta Share',
is3D: true,
sliceVisibilityThreshold: .04,
slices: { 6 : {offset: 0.2},
},
};
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
与布尔数组一起使用会带来巨大优势。我认为这是使第二种方法更快的最大原因。