如何使numpy数组切片元素不同?
我将处理一个numpy数组,并使其成为我想要的形式 以下是源阵列:如何使numpy数组切片元素不同?,numpy,Numpy,我将处理一个numpy数组,并使其成为我想要的形式 以下是源阵列: a=np.array([ [0, 1], [0, 2], [1, 1], [1, 2], [1, 3], [2, 1] ]) 结果数组如下:第一列元素保持不同,第二列元素是相关第一列元素的平均值 详细说明:在a的第一列中有两个0、三个1和一个2元素。结果ret的第一列没有重复元素0/1/2。同时,ret的第二列元素在a中的索引为0时获得[1,2]的平均值或中位数,在a中的索引为1时获得[1,2,3]的平均值或中位数(忘记它们的
a=np.array([
[0, 1],
[0, 2],
[1, 1],
[1, 2],
[1, 3],
[2, 1]
])
结果数组如下:第一列元素保持不同,第二列元素是相关第一列元素的平均值
详细说明:在a
的第一列中有两个0
、三个1
和一个2
元素。结果ret
的第一列没有重复元素0/1/2
。同时,ret
的第二列元素在a
中的索引为0
时获得[1,2]
的平均值或中位数,在a
中的索引为1
时获得[1,2,3]
的平均值或中位数(忘记它们的类型)
请注意,a
的第一列或第二列是否被视为索引序列并不确定
ret=np.array([
[0, 1.5],
[1, 2.0],
[2, 1.0]
])
对不起,我不知道。感谢您的回答。您可以将阵列转换为熊猫数据帧,然后使用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
这是一个仅使用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\u id
和group\u means
保持为单个数组,或者将它们组合成一个:
如果没有用于创建
ret
的代码,很难回答问题,因此您是否可以编辑代码并显示重现错误的代码?理解你想要什么也有点困难,所以你能发布你想要的ret
是什么样的吗?Thanks@user2653663我试图澄清:在a
的第一列中有两个0
,三个1
和一个2
元素。结果ret
的第一列没有重复元素0/1/2
。同时,当a
中的索引为0
时,第二列元素获得[1,2]
的平均值或中值;当a
中的索引为1
时,获得[1,2,3]
的平均值或中值(忘记它们的类型)。有没有办法用numpy切片来解决这个问题,或者我必须将2D numpy数组转换为列表或集合。我建议你用额外的细节编辑你的问题,以便其他人更容易回答。鉴于这种解释,ret[1,1]
不应该是2.0
而不是3.0
?@user2653663再次感谢您的关心和纠正。
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. )]