Python Numpy对共享价值的vectorelements进行操作

时间:2017-06-16 11:04:10

标签: python numpy

Eddited :(我通过尝试简化问题来完成自己的伤害,而且我做得不那么好)

我有一个代表几个月的向量。让我们说120长,并包含代表2月10日2月2日代表所有月份的10月1日。我还有一个表示这几个月数据的向量,它们配对使得月向量中的向量元素20对应于数据向量中的向量元素20。现在我需要将对应于同一个月的所有数据值相加并创建一个由该月的这些聚合值组成的新向量。我如何做到这一点,以便它总结共享价值的vectorelements(例如所有那些1月1日),而不是在范围(1,13)中为i循环。

我想避免循环的原因是我需要在几个月和几小时内完成此操作,并且我每分钟都记录了一年的数据点,并且用一个小时的循环进行一整年将产生一个for循环,i在范围(22000)左右。

很抱歉在我的问题中如此混乱,我道歉但仍然会感激帮助。

2 个答案:

答案 0 :(得分:0)

嗯,从您的问题中不清楚为什么要避免使用for循环,但列表理解似乎可以解决问题:

import numpy as np
array_with_random_integers = np.ceil(np.random.rand(1,1042)*100)   #1042 is just random length
array_with_counts = [np.sum(array_with_random_integers==element) for element in np.arange(1,101)]
sum(array_with_counts)    #Returns 1042, showing that all elements are counted

我假设你的意思是"计数"当你写"总和"在

  

总结所有具有价值的vectorelements

答案 1 :(得分:0)

如果我理解正确的话,我仍然不太确定,但是当事情变得更加清晰时,让我们编辑答案:

我没有找到完全避免循环的方法,但在我的例子中,这些月份只能循环一次。我们的想法是创建一个包含所有单个月份的set,然后创建一个包含相应数据值总和的字典。如果最后需要一个numpy数组,可以很容易地将它们转换回来。

import numpy as np

size = 120
vec = np.array([i%12+1 for i in range(size)])
data = np.random.random(size)

uniques = set(vec)

sums = {}

for i in uniques:
    sums[i] = sum(data[vec==i])

print(vec)
print(uniques)
print(sums)

这给出了:

[ 1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11 12  1
  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11 12  1  2
  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11 12  1  2  3
  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4
  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11 12]
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
{1: 4.9439443614487342, 2: 5.399789601378199, 3: 4.8294837878695169, 4: 4.8454779051312888, 5: 4.8247673795432426, 6: 6.793755999311454, 7: 6.4136044876257436, 8: 4.320805218279439, 9: 6.9444739443947814, 10: 4.49598659161187, 11: 3.8670833795862358, 12: 5.2844155391474272}

注意该算法的设计也适用于未订购月份的情况(正如我从问题的原始版本中了解到的那样),或者如果缺少月份。否则,使用numpy slicing会有更简单的方法。