以下代码
import numpy as np
W = 5 # any odd positive integer
L = 7 # any positive integer
M = (W-1)//2
arr = np.random.choice(range(W),L) - M
生成一个长度为L
的数组,其数字范围为-M
到M
。现在我想修改这个数组,使其总和为0(同时保持元素在-M
到M
内的限制。)
我希望通过添加增量+1 (如果初始总和为负)或增量为-1 (如果初始总和为正)来实现此目的这个数组的元素,从列表的第一个元素开始(然后我应该需要第二个,第三个元素等)。例如,如果初始总和是-2(即负数)且数组是[2,0,-1,...]
那么我不能通过第一个元素增加+1(它已经在最大W=2
处),因此我需要将第二个元素增加两次,结果为[2,2,-1,...]
。
三个样本:
[-1, 0, 0, -1, 2, 0, 2] ---> [-2, -1, 0, -1, 2, 0, 2]
or
[-2, -2, 1, -2, 0, -1, 2] ---> [ 2, -2, 1, -2, 0, -1, 2]
or
[ 2, 2, 2, 2, 2, 2, 2] ---> [-2, -2, -2, 0, 2, 2, 2]
写一些for / while循环很容易做到这一点,但是有更有效的方法(也许是一个numpy函数)?