我在python中有一个二维numpy数组:
[[ 1 2 1 3 3]
[10 20 30 40 60]]
我想在删除第一列之前先在第一行中添加唯一值,然后在第二行中添加相应的值。因此,我的数组的输出为:
[[ 1 2 3 ]
[ 40 20 100 ]]
我是python的新手,我想不出更有效的方法来进行大规模开发。
答案 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]])