如何在Python中进行动态计算

huangapple go评论52阅读模式
英文:

How to doing dynamic calculation in python

问题

如何使奇数索引执行(-),偶数索引执行(+),最大迭代次数为6。迭代1 +10,迭代2 -20,迭代3 +30,迭代4 -40,迭代5 +50,迭代6 -60

import numpy as np

AA = np.array([[9.27914],
               [9.33246],
               [9.26303],
               [9.30597],
               [9.6594],
               [9.04283],
               [8.88866],
               [8.89956]])

max_iter = 6

for i in range(len(AA)):
    if i % 2 == 0:
        AA[i][0] = AA[i][0] + (i // 2 + 1) * 10
    else:
        AA[i][0] = AA[i][0] - (i // 2 + 1) * 10

AA = np.round(AA, 5)  # 四舍五入到五位小数
print("expected results:")
print("AA=np.array([")
for i in range(len(AA)):
    print(f"    [{AA[i][0]:.5f}],")
print("])")

预期结果:

AA=np.array([
    [19.27914],
    [-10.66754],
    [39.26303],
    [-30.69403],
    [59.6594],
    [-50.95717],
    [18.88866],
    [-11.10044],
])

这段代码将按照您的要求对数组进行修改,使奇数索引执行减法,偶数索引执行加法,最大迭代次数为6,每次迭代加减10。希望这可以帮助您得到期望的结果。

英文:

How to make it like that so odd indexes will be doing (-) and even indexes will do (+) The max iteration is 6. iteration 1 +10, iteration 2 -20, iteration 3 +30, iteration 4 -40, iteration 5 + 50, iteration 6 -60

AA = np.array([[9.27914]+10,
              [9.33246]-20,
              [9.26303]+30,
              [9.30597]-40,
              [9.6594 ]+50,
              [9.04283]-60,
              [8.88866]+10,
              [8.89956]-20])

expected results:

AA=np.array([
    [19.27914],
    [-10.66754],
    [39.26303],
    [-30.69403],
    [59.6594],
    [-50.95717],
    [18.88866],
    [-11.10044],
])

I try use this code but not working

max_iter = 6
iter = 0
for i in range(len(AA)):
    if i % 2 == 0:
        AA[i][0] = AA[i][0] + (iter % max_iter)
    else:
       AA[i][0] = AA[i][0] - (iter % max_iter)
    iter += 10

答案1

得分: 2

这是[tag:numpy],不要循环,使用矢量化代码。

取模运算符(%)非常有用,可以重新启动一个序列。

输出:

array([[ 19.27914],
       [-10.66754],
       [ 39.26303],
       [-30.69403],
       [ 59.6594 ],
       [-50.95717],
       [ 18.88866],
       [-11.10044]])

使用的输入:

AA = np.array([[9.27914],
               [9.33246],
               [9.26303],
               [9.30597],
               [9.6594 ],
               [9.04283],
               [8.88866],
               [8.89956]])

中间步骤:

(a%6+1)*10

array([[10],
       [20],
       [30],
       [40],
       [50],
       [60],
       [10],
       [20]])

np.where(a%2, -1, 1)

array([[ 1],
       [-1],
       [ 1],
       [-1],
       [ 1],
       [-1],
       [ 1],
       [-1]])
英文:

This is [tag:numpy], don't loop, use vectorial code.

The modulo operator (%) is quite useful to restart a sequence.

max_iter = 6

a = np.arange(len(AA))[:,None]

out = AA + (a%max_iter+1)*10 * np.where(a%2, -1, 1)

Output:

array([[ 19.27914],
       [-10.66754],
       [ 39.26303],
       [-30.69403],
       [ 59.6594 ],
       [-50.95717],
       [ 18.88866],
       [-11.10044]])

Used input:

AA = np.array([[9.27914],
               [9.33246],
               [9.26303],
               [9.30597],
               [9.6594 ],
               [9.04283],
               [8.88866],
               [8.89956]])

Intermediates:

(a%6+1)*10

array([[10],
       [20],
       [30],
       [40],
       [50],
       [60],
       [10],
       [20]])

np.where(a%2, -1, 1)

array([[ 1],
       [-1],
       [ 1],
       [-1],
       [ 1],
       [-1],
       [ 1],
       [-1]])

答案2

得分: 1

你已经非常接近了。只需进行3个小的更改。我在括号内添加了+1,对每个数组操作添加了*10,并将iter += 10更改为array += 1。

max_iter = 6
array = 0
for i in range(len(AA)):
    if i % 2 == 0:
        AA[i][0] = AA[i][0] + (array % max_iter + 1) * 10
    else:
        AA[i][0] = AA[i][0] - (array % max_iter + 1) * 10
    array += 1

实际上,你可以删除if else语句,如果使用以下代码可以在一行中完成:

AA[i][0] = AA[i][0] + (-1) ** (i) * (array % max_iter + 1) * 10
英文:

You were very close. Just had to make 3 small changes. I added a +1 inside the parenthesis, added *10 for each of the array operations and change iter += 10 to array += 1

max_iter = 6
iter = 0
for i in range(len(AA)):
    if i % 2 == 0:
        AA[i][0] = AA[i][0] + (iter % max_iter+1)*10
    else:
        AA[i][0] = AA[i][0] - (iter % max_iter+1)*10
    iter += 1

In fact, you can remove the if else statement and do it in a single line if you use the following:

AA[i][0] = AA[i][0] +(-1)**(i)* (iter % max_iter+1)*10

答案3

得分: 0

请尝试以下代码:

AA = [
    9.27914,
    9.33246,
    9.26303,
    9.30597,
    9.6594,
    9.04283,
    8.88866,
    8.89956
]

BB=[]

iter = 10
for i in range(len(AA)):
    if i % 2 == 0:
        var = AA[i] + (iter)
    else:
       var = AA[i] - (iter)
    BB.append(var)
    iter += 10
    
for i in range(len(BB)):
    print(BB[i])

注意:最大迭代次数被省略了...将尽快修复。

英文:

Try this:

AA = [
    9.27914,
    9.33246,
    9.26303,
    9.30597,
    9.6594,
    9.04283,
    8.88866,
    8.89956
]

BB=[]

iter = 10
for i in range(len(AA)):
    if i % 2 == 0:
        var = AA[i] + (iter)
    else:
       var = AA[i] - (iter)
    BB.append(var)
    iter += 10
    
for i in range(len(BB)):
    print(BB[i])

Note: left out max iterations... will fix asap.

答案4

得分: 0

你目前的根本问题是混淆了变量 iter 的含义。有时似乎你想要它是10的倍数,有时又是1到6之间的数字。让我们将其分离并稍微清理一下代码。

给定:

import numpy
AA = numpy.array([
    [9.27914],
    [9.33246],
    [9.26303],
    [9.30597],
    [9.6594 ],
    [9.04283],
    [8.88866],
    [8.89956]
])

然后我们可以这样做:

max_iter = 6
iter = 1
for i in range(len(AA)):
    delta = 10 * (iter % max_iter)
    sign = 1 if i % 2 == 0 else -1
    AA[i][0] += sign * delta
    iter += 1

print(AA)

以获得:

[
 [ 19.27914]
 [-10.66754]
 [ 39.26303]
 [-30.69403]
 [ 59.6594 ]
 [  9.04283]
 [ 18.88866]
 [-11.10044]
]

或者如果你更喜欢接近你最初的代码:

max_iter = 6
iter = 1
for i in range(len(AA)):
    if i % 2 == 0:
        AA[i][0] += 10 * (iter % max_iter)
    else:
        AA[i][0] -= 10 * (iter % max_iter)
    iter += 1

print(AA)
英文:

The root issue you have is a muddling of the meaning of your variable iter. Sometimes you seems to want to be a multiple of 10 and sometimes a number between 1 and 6. Let's separate that out and clean up the code a bit.

Given:

import numpy
AA = numpy.array([
    [9.27914],
    [9.33246],
    [9.26303],
    [9.30597],
    [9.6594 ],
    [9.04283],
    [8.88866],
    [8.89956]
])

Then we can do:

max_iter = 6
iter = 1
for i in range(len(AA)):
    delta = 10 * (iter % max_iter)
    sign = 1 if i % 2 == 0 else -1
    AA[i][0] += sign * delta
    iter += 1

print(AA)

to get:

[
 [ 19.27914]
 [-10.66754]
 [ 39.26303]
 [-30.69403]
 [ 59.6594 ]
 [  9.04283]
 [ 18.88866]
 [-11.10044]
]

or if you like something closer to what you started with:

max_iter = 6
iter = 1
for i in range(len(AA)):
    if i % 2 == 0:
        AA[i][0] += 10 * (iter % max_iter)
    else:
        AA[i][0] -= 10 * (iter % max_iter)
    iter += 1

print(AA)

答案5

得分: 0

以下是已翻译的代码部分:

我为你编写了一个不使用循环并能产生所需结果的函数

    AA = np.array([[9.27914],
              [9.33246],
              [9.26303],
              [9.30597],
              [9.6594 ],
              [9.04283],
              [8.88866],
              [8.89956]])

    expected_output = np.array([[19.27914],
              [-10.66754],
              [39.26303],
              [-30.69403],
              [59.6594],
              [-50.95717],
              [18.88866],
              [-11.10044],
    ])

    def test(AA, iterstep, maxiter):
        aa_shape = AA.shape
        arr1 = np.tile(np.arange(1, max_iter+1), (aa_shape[0] // maxiter) + 1)[:aa_shape[0]] 
        sign_arr = np.tile(np.array([1, -1]), (aa_shape[0] // 2) + 1)[:aa_shape[0]]
        _ = (arr1*sign_arr)*10
        _=_.reshape(AA.shape)
        return AA + _

    res = test(AA, 10, 6)

    # 测试
    assert (np.all(np.isclose(res, expected_output)))
英文:

I write for you a function that works without loops and give you desired result.

AA = np.array([[9.27914],
          [9.33246],
          [9.26303],
          [9.30597],
          [9.6594 ],
          [9.04283],
          [8.88866],
          [8.89956]])

expected_output = np.array([[19.27914],
          [-10.66754],
          [39.26303],
          [-30.69403],
          [59.6594],
          [-50.95717],
          [18.88866],
          [-11.10044],
])

def test(AA, iterstep, maxiter):
    aa_shape = AA.shape
    arr1 = np.tile(np.arange(1, max_iter+1), (aa_shape[0] // maxiter) + 1)[:aa_shape[0]] 
    sign_arr = np.tile(np.array([1, -1]), (aa_shape[0] // 2) + 1)[:aa_shape[0]]
    _ = (arr1*sign_arr)*10
    _=_.reshape(AA.shape)
    return AA + _

res = test(AA, 10, 6)

# Test 
assert (np.all(np.isclose(res, expected_output)))

huangapple
  • 本文由 发表于 2023年6月1日 22:21:59
  • 转载请务必保留本文链接:https://go.coder-hub.com/76382920.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定