numpy广播如何表现得更快?

时间:2016-10-15 07:22:14

标签: python numpy

在以下问题中, https://stackoverflow.com/a/40056135/5714445

Numpy的广播提供的解决方案比使用与np.view()配对的np.setdiff1d()快了近6倍。它是如何设法做到的?

使用A[~((A[:,None,:] == B).all(-1)).any(1)]可以加快速度。 有趣,但提出了另一个问题。这个表现如何更好?

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()intboolean 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); } 与布尔数组一起使用会带来巨大优势。我认为这是使第二种方法更快的最大原因。