如何减少基于键而不是轴的numpy数组?

时间:2019-11-08 03:15:03

标签: python arrays numpy key reduce

我有2列的numpy数组。第二列代表我要减少的键。

>>> x
array([[0.1 , 1.  ],
       [0.25, 1.  ],
       [0.45, 0.  ],
       [0.55, 0.  ]])

我想总结所有共享一个键的值,像这样。

>>>sum_key(x)
array([[0.35 , 1.  ],
       [1.0, 0.  ]])

这似乎是一个相对普遍的任务,但我找不到很好的名字或看到它进行讨论。 有什么想法吗?

3 个答案:

答案 0 :(得分:0)

这有点复杂,但是应该可以完成工作:

import numpy as np
x = np.array([[0.1 , 1.  ],
       [0.25, 1.  ],
       [0.45, 0.  ],
       [0.55, 0.  ]])
keys = x[:,1]
values = x[:,0]
keys_unique = np.unique(keys)
print([[sum(values[keys == k]), k] for k in keys_unique])

输出:

[[1.0, 0.0], [0.35, 1.0]]

答案 1 :(得分:0)

import numpy as np
import pandas as pd

data = np.array([[0.1 , 1.  ],
       [0.25, 1.  ],
       [0.45, 0.  ],
       [0.55, 0.  ]])

df = pd.DataFrame(data)

gr = df.groupby([1])[0].agg('sum')

print(gr.keys().values)

data1 = np.array([[gr[k],k] for k in gr.keys().values])
print(data1)

答案 2 :(得分:0)

如果索引(键)是升序整数(或者可以根据情况轻松转换),则最方便的方法是使用 np.bincount

import numpy as np

x = np.array([[0.1 , 1.  ],
             [0.25, 1.  ],
             [0.45, 0.  ],
             [0.55, 0.  ]])

v = x[:, 0]
i = x[:, 1]

counts = np.bincount(i.astype(int), v)

print(counts)

# returns [1.   0.35]