我有一个numpy数组,希望根据最上面的行“伸缩”值。举例说明是最好的方法
开始数组:
9 9 8 7 7 7 6
1 2 3 4 5 6 3
3 4 5 6 7 6 3
5 6 7 8 9 6 4
所需输出阵列:
9 8 7 6
3 3 15 3
7 5 19 3
11 7 23 4
这样做的目的是对最上面的行进行唯一化,并对随后的行中的值进行求和,这些行按最上面一行中的值分组。最上面一行将被排序,数组的宽度约为2000个单元格,长度约为200000个单元格。顶行中可以有任意数量的连续相同的数字。我目前的做法是(示例中的顶行标签略有不同),我将打印到屏幕上,而不是创建最终的数组来检查输出。计划是堆叠输出以生成输出数组)
import numpy as N
kk=N.array([[90,90,85,80,80,80,70],[1,2,3,4,5,6,3],[3,4,5,6,7,6,3],[5,6,7,8,9,6,4]])
ll=kk[:,0]
for i in range(1,len(kk[0])):
if kk[0][i]==kk[0][i-1]:
ll=ll+kk[:,i]
elif kk[0][i]!=kk[0][i-1]:
print "sum=", ll, i,kk[0][i],kk[0][i-1]
ll=kk[:,i]
有两个缺陷。主要的一点是,它没有处理最后一列,我不明白为什么。次要的一点是,它也是对第一行的求和。很明显为什么会发生这种小事故。我想我可以勉强应付这个问题,但是最后一个专栏的失败让我沮丧了一段时间,我真的很感激任何处理这个问题的建议。你知道吗
谢谢你的帮助
如果有} 对该操作进行矢量化,但首先需要创建一个数组,其中包含第一行中每组重复项的第一个项的索引:
200,000
行,Python循环可能会非常慢。使用NumPy,您可以使用^{然后可以通过使用
mask
布尔数组对第一行进行索引来获取第一行:数组的其余部分使用
reduceat
和indices
:假设原始数组是默认的整数类型,可以通过执行以下操作来组装数组:
您可以使用^{} :
提供输出:
您应该使用numpy的唯一函数
您应该注意到
u
将从最低到最高排序。如果你想让它从最高到最低,你必须这样做最后。你知道吗
相关问题 更多 >
编程相关推荐