我想从数组的第一个元素中减去一个数字 x
,如果数组中的第一个元素小于 x
我想从第二个元素中减去剩余的数量数组等等。
我已经试过了:
import numpy as np
x = 25
y = np.array([22, 30, 45])
result = np.copy(y)
for i in range(len(y)):
if y[i] < x:
result[i] = y[i] - x
x = x - y[i]
else:
result[i] = y[i] - x
x = x - y[i]
我得到了这个结果:
array([-3, 27, 72])
但是我想要
array([0, 27, 45])
答案 0 :(得分:1)
在 if
的情况下,您应该分配 0
在 else
的情况下,必须有一个 break
停止,因为所有要删除的值都已消耗
def sub_array(array, to_remove):
result = np.copy(array)
for i in range(len(array)):
if array[i] < to_remove:
result[i] = 0
to_remove -= array[i]
else:
result[i] = array[i] - to_remove
break
return result
print(sub_array(np.array([10, 10, 10]), 39)) # [0 0 0]
print(sub_array(np.array([10, 10, 10]), 29)) # [0 0 1]
print(sub_array(np.array([10, 10, 10]), 19)) # [0 1 10]
print(sub_array(np.array([10, 10, 10]), 9)) # [1 10 10]
答案 1 :(得分:0)
我改变了它,所以它只在 z2>0 时继续:
for i in range(len(y2)):
if z2>0:
result[i] = max(y2[i] - z2,0)
z2 = z2 - y2[i]
答案 2 :(得分:0)
试试这个
import numpy as np
x = 25
z = x
l= np.array([22, 30, 45])
i = 0
while(x>0 and i<len(l)):
if x>=l[i]:
x-=l[i]
l[i]=0
else:
l[i]-=x
x=-1
z=x
i+=1
print(l)
答案 3 :(得分:0)
问题在于,首先,y2[i] - z2
将是负数,这就是您得到 -3 的原因。第二个问题是,当它进入 else 条件时,它使 z2 为负。这会产生一个问题,因为此时 z2=-27
为 45--27=72。你可以试试这个解决方案:
import numpy as np
x2 = 25
y2= np.array([22, 30, 45])
z2 = x2
result = np.copy(y2)
for i in range(len(y2)):
if y2[i] < z2:
result[i] = 0
z2 = z2 - y2[i]
else:
result[i] = y2[i]- z2
if z2-y2[i]<0:
break
z2 = z2 - y2[i]
print(result)
答案 4 :(得分:0)
您的循环正确检查 if y[i] < x
,但随后将明显的负差异而不是零分配给结果。下一行应该是
result[i] = 0
话虽如此,如果您在 numpy 中使用循环,那么您就没有使用 numpy 的强大功能。如果您观察到以下情况,您可以以完全矢量化的方式执行此操作:
n
的前 y
个元素的总和必须小于或等于 x
。您可以使用 np.cumsum
计算运行总和:
s = np.r_[y2, x].cumsum()
将 x
附加到 y2
可确保累计总和肯定会超过 x
。
找到总和超过 x
的第一个元素:
n = (s >= x).argmax()
现在将初始元素设置为零并减去余数:
y2[:n + 1] = 0
y2[n] -= x - s[n]