我将处理一个numpy数组并将其设置为我想要的形式。
这是源数组:
a = np.array([
[0, 1],
[0, 2],
[1, 1],
[1, 2],
[1, 3],
[2, 1]
])
结果数组就像:第一列元素保持不同,第二列元素是相关的第一列元素的平均值。
详细说明:0
的第一列中有两个1
,三个2
和一个a
元素。结果ret
的第一列包含无重复元素0/1/2
。同时,当ret
中的索引为[1, 2]
时,0
的第二列元素获得a
的平均值或中位数,[1,2,3]
的平均值或中位数当索引是1
中的a
时(忘记它们的类型)。
请注意,不确定a
的第一列还是第二列是否被视为索引序列。
ret = np.array([
[0, 1.5],
[1, 2.0],
[2, 1.0]
])
对不起,我一无所知。感谢您的回答。
答案 0 :(得分:1)
您可以将数组转换为熊猫数据框,然后使用groupby。
import pandas as pd
import numpy as np
a = np.array([
[0, 1],
[0, 2],
[1, 1],
[1, 2],
[1, 3],
[2, 1]])
a=pd.DataFrame(a)
a=a.groupby(0).mean()
请注意,由于没有为变量分配任何名称,因此我们将其分组为“ 0”,并且在您的问题中,您说第一列是要分组的列。
最后,如果要转换回numpy数组,可以执行以下操作:
a=a.values
答案 1 :(得分:1)
这是仅使用NumPy的解决方案:
import numpy as np
a = np.array([
[0, 1],
[0, 2],
[1, 1],
[1, 2],
[1, 3],
[2, 1]
])
group = a[:, 0]
values = a[:, 1]
# Take unique group ids
group_ids, group_idx, group_counts = np.unique(group, return_inverse=True,
return_counts=True)
# Compute sum of group values
group_adds = np.zeros(len(group_ids))
np.add.at(group_adds, group_idx, values)
# Compute means
group_means = group_adds / group_counts
# Compose result
result = np.stack([group_ids, group_means], axis=1)
print(result)
# [[0. 1.5]
# [1. 2. ]
# [2. 1. ]]
请注意,result
是具有浮点类型的数组。如果要将组ID保留为整数,则可以将group_ids
和group_means
保留为单独的数组,也可以将它们组合为structured array:
result_struct = np.empty(len(group_ids), dtype=[('id', 'i4'), ('mean', 'f8')])
result_struct['id'] = group_ids
result_struct['mean'] = group_means
print(result_struct)
# [(0, 1.5) (1, 2. ) (2, 1. )]