如何从数组的第一个元素中减去一个值?

时间:2021-06-16 19:31:12

标签: python arrays numpy

我想从数组的第一个元素中减去一个数字 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])

5 个答案:

答案 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 的强大功能。如果您观察到以下情况,您可以以完全矢量化的方式执行此操作:

  1. 要设置为零的 n 的前 y 个元素的总和必须小于或等于 x
  2. 以下元素将按差异递减。

您可以使用 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]