如何在for循环中重复操作n次

时间:2020-09-16 01:06:51

标签: python numpy for-loop

以下代码的第一个输入是一个像a=3这样的单个值,第二个输入是一个由成对的值组成的数组,例如:B = [[1000, 1], [1000, 3], [999, 4]]。如果每对的第一个值是偶数,那么我希望相应的输出值基于代码中所示的某些特定计算;如果第一个值是奇数,则有另一个计算,如代码所示。该对中的第二个值是我要为该对重复计算的次数。该示例中的计算应分别对1、2和3重复1、3和4次。

我不确定如何重复计算。

import numpy as np

a = np.array(input(), dtype=int)
B = []
for i in range(a):
    b = np.array(input().split(), dtype=int)
    B.append(b)
B = np.array(B)
C = []

for i in range(a):
    if B[i, 0] % 2==0:
        c = (B[i, 0] - 99) * 3        
        C.append(c)
    else: 
        if B[i, 0] % 2 == 1:
            d = (B[i, 0] - 15) * 2    
            C.append(d)

2 个答案:

答案 0 :(得分:3)

忽略输入,假设您有一个数组

B = np.array([[1000, 1], [1000, 3], [999, 4]])

您可以使用遮罩执行选择性计算。最快的输入方式可能是使用np.where

C = np.where(B[:, 0] % 2, 2 * (B[:, 0] - 15), 3 * (B[:, 0] - 99))

这有点低效,因为它会为每个元素计算两个值。一种更有效但更丑陋的方法是就地执行所有操作:

b = B[:, 0]
mask = (b % 2 == 0)
C = np.empty_like(b)
np.subtract(b, 99, out=C, where=mask)
np.subtract(b, 15, out=C, where=~mask)
np.multiply(C, 3, out=C, where=mask)
np.multiply(C, 2, out=C, where=~mask)

Numpy然后提供repeat函数以在计算输出值之后进行重复:

C = np.repeat(C, B[:, 1])

您可以将所有内容写成单行:

C = np.repeat(np.where(B[:, 0] % 2, 2 * (B[:, 0] - 15), 3 * (B[:, 0] - 99)), B[:, 1])

答案 1 :(得分:1)

嵌套for循环的情况可能是这样。您有外部循环,然后循环进行一定次数的计算。因此,从您的示例中尝试以下方法:

for i in range(a):
    for x in range(B[i][1]):
         if B[i][0] % 2 == 0:
             B[i][0]=(B[i][0]-99)*3
         else:
             B[i][0]=(B[i][0]-15)*2
         C.append(B[i][0]

编辑:如果要重复相同的值,只需将其放回B中,然后将B的该元素的值附加回C

一些其他注释,与您的问题并没有真正的联系,但是由于数字是偶数还是奇数,因此您if中不需要第二个else语句。如果确实需要显式检查其他条件,请使用Python的elif语句,它是else if的缩写,该语句仅在不满足先前条件的情况下才检查条件。