通过添加相应的值在2D numpy数组中创建唯一行

时间:2018-10-30 15:38:07

标签: python python-3.x numpy

我在python中有一个二维numpy数组:

[[ 1  2  1  3  3]
 [10 20 30 40 60]]

我想在删除第一列之前先在第一行中添加唯一值,然后在第二行中添加相应的值。因此,我的数组的输出为:

[[  1   2   3 ]
 [ 40  20 100 ]]

我是python的新手,我想不出更有效的方法来进行大规模开发。

4 个答案:

答案 0 :(得分:3)

不幸的是,numpy没有内置的groupby函数(尽管有ways to write them)。如果您愿意使用pandas,这很简单:

import pandas as pd

>>> pd.DataFrame(a.T).groupby(0,as_index=False).sum().values.T

array([[  1,   2,   3],
       [ 40,  20, 100]])

答案 1 :(得分:0)

a = np.array([[ 1,  2,  1,  3,  3],
              [10, 20, 30, 40, 60]])

unique_values = np.unique(a[0])
new_array = np.zeros((2, len(unique_values)))
for i, uniq in enumerate(np.unique(a[0])):

    new_array[0][i] = uniq
    new_array[1][i] = np.where(a[0]==uniq,a[1],0).sum()

答案 2 :(得分:0)

我认为您不会比使用字典进行计数然后从中创建数组效率更高:

from collections import defaultdict
import numpy

sums = defaultdict(float)

arr = numpy.array([[ 1,  2,  1,  3,  3],
                   [10, 20, 30, 40, 60]]

for key, value in zip(*arr):
    sums[key] += value


numpy.array(list(sums.items())).T

返回

array([[  1.,   2.,   3.],
       [ 40.,  20., 100.]])

答案 3 :(得分:0)

您可以使用sparse.csr_matrix

from scipy import sparse
b = a[0]
v = a[1]
m = b.max() + 1
s = v.shape[0]

res = sparse.csr_matrix((v, b, np.arange(s+1)), (s, m)).sum(0)

matrix([[  0,  40,  20, 100]], dtype=int32)

在这种情况下,这显示了0-a[0].max()中每个值的总和,因此可以将其链接回您的初始结果:

t = np.unique(a[0])
np.stack((t, res.A1[t]))

array([[  1,   2,   3],
       [ 40,  20, 100]])