检查2个数组数组的相等数组的数量

时间:2018-04-12 07:50:20

标签: python arrays numpy

我想检查numpy数组中有多少个numpy数组元素是不同的。 解决方案不应包含列表理解。 沿着这些方向的东西(注意a和b在最后一个数组中不同):

a = np.array( [[1,1,1],[2,2,2],[3,3,3],[4,4,4],[5,5,5]] )
b = np.array( [[1,1,1],[2,2,2],[3,3,3],[4,4,4],[5,0,0]] )
y = diff_count( a,b )
print y

>> 1

4 个答案:

答案 0 :(得分:2)

方法#1

对不相等进行逐元素比较,然后沿最后一轴减少ANY,最后计算 -

(a!=b).any(-1).sum()

方法#2

使用np.count_nonzero计算布尔值的速度可能更快 -

np.count_nonzero((a!=b).any(-1))

方法#3

views -

的速度要快得多
# https://stackoverflow.com/a/45313353/ @Divakar
def view1D(a, b): # a, b are arrays
    a = np.ascontiguousarray(a)
    b = np.ascontiguousarray(b)
    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
    return a.view(void_dt).ravel(),  b.view(void_dt).ravel()

a1D,b1D = view1D(a,b)
out = np.count_nonzero(a1D!=b1D)

基准

In [32]: np.random.seed(0)
    ...: m,n = 10000,100
    ...: a = np.random.randint(0,9,(m,n))
    ...: b = a.copy()
    ...: 
    ...: # Let's set 10% of rows as different ones
    ...: b[np.random.choice(len(a), len(a)//10, replace=0)] = 0

In [33]: %timeit (a!=b).any(-1).sum() # app#1 from this soln
    ...: %timeit np.count_nonzero((a!=b).any(-1)) # app#2
    ...: %timeit np.any(a - b, axis=1).sum() # @Graipher's soln
1000 loops, best of 3: 1.14 ms per loop
1000 loops, best of 3: 1.08 ms per loop
100 loops, best of 3: 2.33 ms per loop

In [34]: %%timeit  # app#3
    ...: a1D,b1D = view1D(a,b)
    ...: out = np.count_nonzero((a1D!=b1D).any(-1))
1000 loops, best of 3: 797 µs per loop

答案 1 :(得分:1)

您可以使用np.ravel()进行尝试。如果你想进行元素比较。

(a.ravel()!=b.ravel()).sum()
(a-b).any(axis=0).sum()

以上行提供2作为输出。

如果您想进行行比较,可以使用。

(a-b).any(axis=1).sum()

这会将1作为输出。

答案 2 :(得分:0)

您可以使用numpy.any

y = np.any(a - b, axis=1).sum()

答案 3 :(得分:0)

这会有用吗?

         return {
                restrict: 'A',
                transclude: 'true',
                templateUrl: 'js/application/alpha.html',
                link: function ($scope, elem,  attrs) {
                     // $scope.formsDropDown.placeholder = "ABC" ;
                     attrs.$set('placeholder','ABC');
              }
          }

很抱歉,我现在无法自己测试。