如何使numpy数组切片元素与众不同?

时间:2019-04-04 07:52:24

标签: numpy

我将处理一个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]
])

对不起,我一无所知。感谢您的回答。

2 个答案:

答案 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_idsgroup_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. )]