迭代地减去数组

时间:2017-04-05 07:51:44

标签: python arrays numpy

从简单的numpy数组开始,如:

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

我的目标是迭代地从中减去值直到某个阈值。例如,考虑a包括用户数量。在这种情况下,5个用户分发:

d = a/a.sum()

现在我想从这个初始分配中减去4个用户,始终保持值>结果数组中为0。我可以构造一个随机数组来减去:

b = np.random.multinomial(4,d)

生成(在一次运行中):

array([0, 1, 0, 3, 0, 0])

a-b之类的结果会导致:

array([ 1,  0,  0, -1,  1,  0])

如何约束生成的数组在结果(a-b)操作中永远不会产生负值?到目前为止,我一直在考虑从另一方面做事情,产生随机分布:

r = np.random.multinomial(total users - deleted users,d)

根据用户d的初始分布,但由于我必须在向量上应用一些指标,因此后一种方法的结果可能会有所不同。

1 个答案:

答案 0 :(得分:2)

如果你想a.sum() n随机递减adef rnd_decrement(a, n): c = np.cumsum(np.r_[0, a]) if n < c[-1]: r = np.random.choice(np.arange(c[-1]) + 1, n, replace = False) d = np.sum(r[:,None] <= c[None,:], axis=0) return np.diff(c-d) else: return np.zeros_like(a) 没有任何元素变为负数,这是一种方法:

#If necessary filtering:
#df = df[df.groupby("Tran")['Type'].transform('size') == 3]

idx = df.pivot(index='Tran', columns='Type', values='Amount').query('A + AA == CC').index
print (idx)
Int64Index([1212, 1213, 1214], dtype='int64', name='Tran')

df = df[df.Tran.isin(idx)]
#same as
#df = df.query('Tran in @idx')
print (df)
   Tran Type  Amount   comment
0  1212    A      12       Buy
1  1212   AA      13       Buy
2  1212   CC      25         S
3  1213   AA    1112         B
4  1213    A      78         B
5  1213   CC    1190  SEllding
6  1214   AA    1112         B
7  1214    A      78         B
8  1214   CC    1190  SEllding