计算numpy数组中列的出现次数

Chr*_*her 5 python numpy

给定一个2 xd维numpy数组M,我想计算M每列的出现次数.也就是说,我正在寻找一般的版本bincount.

到目前为止我尝试过:(1)将列转换为元组(2)使用散列元组(via hash)到自然数(3)numpy.bincount.

这看起来很笨拙.有人知道更优雅高效的方式吗?

eph*_*eph 5

您可以使用collections.Counter

>>> import numpy as np
>>> a = np.array([[ 0,  1,  2,  4,  5,  1,  2,  3],
...               [ 4,  5,  6,  8,  9,  5,  6,  7],
...               [ 8,  9, 10, 12, 13,  9, 10, 11]])
>>> from collections import Counter
>>> Counter(map(tuple, a.T))
Counter({(2, 6, 10): 2, (1, 5, 9): 2, (4, 8, 12): 1, (5, 9, 13): 1, (3, 7, 11):
1, (0, 4, 8): 1})
Run Code Online (Sandbox Code Playgroud)


ily*_*nam 2

鉴于:

\n\n
a = np.array([[ 0,  1,  2,  4,  5,  1,  2,  3],\n              [ 4,  5,  6,  8,  9,  5,  6,  7],\n              [ 8,  9, 10, 12, 13,  9, 10, 11]])\nb = np.transpose(a)\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. 比散列更有效的解决方案(仍然需要操作):

    \n\n

    np.void我使用灵活的数据类型(请参阅此处)创建数组的视图,以便每一行都成为单个元素。转换为该形状将允许np.unique对其进行操作。

    \n\n
    %%timeit    \nc = np.ascontiguousarray(b).view(np.dtype((np.void, b.dtype.itemsize*b.shape[1])))\n_, index, counts = np.unique(c, return_index = True, return_counts = True)\n#counts are in the last column, remember original array is transposed\n>>>np.concatenate((b[idx], cnt[:, None]), axis = 1)\narray([[ 0,  4,  8,  1],\n       [ 1,  5,  9,  2],\n       [ 2,  6, 10,  2],\n       [ 3,  7, 11,  1],\n       [ 4,  8, 12,  1],\n       [ 5,  9, 13,  1]])\n10000 loops, best of 3: 65.4 \xc2\xb5s per loop\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    附加到 的唯一列的计数a

  2. \n
  3. 您的哈希解决方案。

    \n\n
    %%timeit\narray_hash = [hash(tuple(row)) for row in b]\nuniq, index, counts = np.unique(array_hash, return_index= True, return_counts = True)\nnp.concatenate((b[idx], cnt[:, None]), axis = 1)\n10000 loops, best of 3: 89.5 \xc2\xb5s per loop\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
\n\n

更新:Eph 的解决方案是最高效和优雅的。

\n\n
%%timeit\nCounter(map(tuple, a.T))\n10000 loops, best of 3: 38.3 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n