从简单的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
的初始分布,但由于我必须在向量上应用一些指标,因此后一种方法的结果可能会有所不同。
答案 0 :(得分:2)
如果你想a.sum()
n
随机递减a
而def 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