Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使numpy数组切片元素不同?_Numpy - Fatal编程技术网

如何使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]的平均值或中位数(忘记它们的

我将处理一个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
的第一列或第二列是否被视为索引序列并不确定

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. )]