如何使numpy数组切片元素不重复?

3

我将处理一个numpy数组并使其成为我想要的形式。

以下是源数组:

a = np.array([
  [0, 1],
  [0, 2],
  [1, 1],
  [1, 2],
  [1, 3],
  [2, 1]
])

结果数组如下:第一列元素保持不同,而第二列元素是与相关第一列元素的平均值。
详细解释:在数组a的第一列中有两个0,三个1和一个2元素。结果ret的第一列具有不重复的元素0/1/2。同时,当索引为0时,在a中第二列元素获得[1,2]的平均值或中位数,当索引为1时,在a中第二列元素获得[1,2,3]的平均值或中位数(忘记它们的类型)。
请注意,不确定a的第一列或第二列是否被视为索引序列。
ret = np.array([
  [0, 1.5],
  [1, 2.0],
  [2, 1.0]
])

很抱歉我不知道。感谢您的回答。


没有 ret 创建的代码,很难回答你的问题。所以,你能否编辑你的代码并展示一个最小化可复现代码示例来说明错误?同时,我们也不太明白你的需求,请问你能否提供一下你期望的 ret 是什么样子的呢? - user2653663
感谢@user2653663,我尽量让它清晰明了:在数组a的第一列中,有两个0,三个1和一个2元素。结果数组ret的第一列具有不重复的元素0/1/2。同时,当a中索引为0时,第二列元素获得[1,2]的平均值或中位数;当索引为1时,第二列元素获得[1,2,3]的平均值或中位数(忘记它们的类型)。是否有使用numpy切片解决这个问题的方法,还是必须将2D numpy数组转换为列表或集合? - yuhenry
我建议您编辑问题并提供额外的细节,以便其他人更容易回答。鉴于这个解释,ret[1,1] 应该是 2.0 而不是 3.0,对吗? - user2653663
@user2653663 再次感谢您的关心和纠正。 - yuhenry
2个回答

2
你可以将数组转换为 Pandas 数据框,然后使用 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

2

这是一个仅使用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保留为单独的数组,或将它们组合成结构化数组
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. )]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接