我有以下数组[] []:
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]
])
答案 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])