python:按某些id计算事件

时间:2016-10-29 17:28:30

标签: python arrays numpy

我有以下数组[] []:

import numpy as np

data = np.array([
    [20,  0,  1],
    [22,  0,  1],
    [31,  0,  0],
    [49,  1,  0],
    [96,  1,  0],
    [57,  2,  1],
    [45,  3,  0],
    [12,  3,  0],
    [14,  3,  1],
    [33,  4,  1],
    [34,  4,  1],
    [15,  4,  1]
])

让我们通过a, b, c的上述顺序调用列b is id。 我想根据c列中的ID来计算b列中1的数量 这将导致以下2列数组(第1列是唯一的(b),第2列根据该ID从c计算1):

data = np.array([
    [4,  3],
    [0,  2],
    [2,  1],
    [3,  1],
    [1,  0]
])

您还可以看到它按c列中的计数1来排序

我解决这个问题的想法是通过b列中的id创建一个dictionery:{ id1:counted 1's id2:counted 1's ... }并迭代数组并计算每个id的1的数量并将其作为每个值的值键入字典,然后从结果中创建一个数组并按第二列排序。

是否有任何pythonic简单易行的方法?

另一种情况是我想在每个id的c列中添加所有整数,所以对于:

data = np.array([
    [20,  0,  2],
    [22,  0,  1],
    [31,  0,  0],
    [49,  1,  0],
    [96,  1,  0],
    [57,  2,  1],
    [45,  3,  0],
    [12,  3,  5],
    [14,  3,  1],
    [33,  4,  1],
    [34,  4,  3],
    [15,  4,  4]
])

我会得到

data = np.array([
    [4,  8],
    [3,  6],
    [0,  3],
    [2,  1],
    [1,  0]
])

1 个答案:

答案 0 :(得分:3)

您可以使用np.bincount -

count = np.bincount(data[:,1],data[:,2]==1)
out = np.column_stack((np.unique(data[:,1]),count))

如果按照计数的降序需要它,我们需要再添加两行代码 -

sidx = count.argsort()[::-1]
out = np.column_stack((sidx,count[sidx]))

或者,如果您按照计数的降序需要它并保持顺序,请将argsort'mergesort'一起使用,就像这样 -

sidx = (-count).argsort(kind='mergesort')
out = np.column_stack((sidx,count[sidx]))

示例运行 -

输入数组:

In [36]: data
Out[36]: 
array([[20,  0,  1],
       [22,  0,  1],
       [31,  0,  0],
       [49,  1,  0],
       [96,  1,  0],
       [57,  2,  1],
       [45,  3,  0],
       [12,  3,  0],
       [14,  3,  1],
       [33,  4,  1],
       [34,  4,  1],
       [15,  4,  1]])

第1部分:

In [37]: count = np.bincount(data[:,1],data[:,2]==1)
    ...: out = np.column_stack((np.unique(data[:,1]),count))
    ...: 

In [38]: out
Out[38]: 
array([[ 0.,  2.],
       [ 1.,  0.],
       [ 2.,  1.],
       [ 3.,  1.],
       [ 4.,  3.]])

第2部分:

In [39]: sidx = count.argsort()[::-1]
    ...: out = np.column_stack((sidx,count[sidx]))
    ...: 

In [40]: out
Out[40]: 
array([[ 4.,  3.],
       [ 0.,  2.],
       [ 3.,  1.],
       [ 2.,  1.],
       [ 1.,  0.]])

第3部分:

In [48]: sidx = (-count).argsort(kind='mergesort')

In [49]: np.column_stack((sidx,count[sidx]))
Out[49]: 
array([[ 4.,  3.],
       [ 0.,  2.],
       [ 2.,  1.],
       [ 3.,  1.],
       [ 1.,  0.]])

要为每个ID添加c列中的所有整数,只需跳过针对1 -

的检查
count = np.bincount(data[:,1],data[:,2])