【问题标题】:How do I iterate through a numpy array and perform calculations?如何遍历 numpy 数组并执行计算?
【发布时间】:2021-11-28 16:16:58
【问题描述】:

我想遍历一个 numpy 数组并执行除法、乘法和加法。我一直想出几个错误。最新的是

IndexError: 标量变量的索引无效。

import numpy as np
rays = np.array([[7.651e-03, 7.284e-03, 5.134e-03, 7.442e-03, 3.035e-03)],[2.373e-03, 6.877e-03, 4.809e-03, 2.870e-04, 3.175e-04, 1.791e-03]])

for i in range(rays):
    for w in range(i):
        estimate = rays[0][i]/(rays[0][i]+rays[1][i])

【问题讨论】:

  • 您的 rays 定义在语法上看起来不正确 - 第一个子列表中的 ) 不匹配。这也不是一个 numpy 数组,它是一个列表列表。
  • 代码中的“ray”不是“rays”是什么?
  • 那是我的错,我应该指定 numpy 数组。打算尝试更改标题和光线类型。
  • 你希望你的输出是什么?您的代码将重复替换 estimate 的值,从而导致最后一个值的比率。你不妨写estimate = rays[0][-1]/(rays[0][-1]+rays[1][-1]) 没有任何for 循环。
  • @AlainT。它将被附加到一个列表并转换为一个数组 (1000, )

标签: python numpy-ndarray addition


【解决方案1】:

修正您的 rays 定义:

rays = [
    [7.651e-03, 7.284e-03, 5.134e-03, 7.442e-03, 3.035e-03],
    [2.373e-03, 6.877e-03, 4.809e-03, 2.870e-04, 3.175e-04, 1.791e-03]
]

我们可以像这样迭代地计算您的估计值:

for r0, r1 in zip(*rays):
    estimate = r0 / (r0 + r1)
    print(estimate)

如果你不熟悉zip(注意zip(*rays)zip(rays[0], rays[1])是一样的),上面的基本等价于:

for i in range(len(rays[0])):  # assuming all rays have same length!
    r0, r1 = rays[0][i], rays[1][i]
    estimate = r0 / (r0 + r1)
    print(estimate)

zip 版本被认为更“pythonic”(显然更简洁)。

【讨论】:

    【解决方案2】:
    rays = [
    [7.651e-03, 7.284e-03, 5.134e-03, 7.442e-03, 3.035e-03],
    [2.373e-03, 6.877e-03, 4.809e-03, 2.870e-04, 3.175e-04],
    ]
    
    for i in range(min(len(rays[0]), len(rays[1]))):
        estimate = rays[0][i] / (rays[0][i] + rays[1][i])
        print(estimate)
    

    【讨论】:

    • 感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将有助于未来的读者更好地了解正在发生的事情,尤其是那些刚接触该语言并难以理解概念的社区成员。
    【解决方案3】:

    您的示例存在几个问题(其中一些可能是实际问题,其他只是拼写错误或过于简单化):

    import numpy as np     # if you want to use for-loops don't use numpy
    rays = np.array(...    # closing parentheses instead of brackets
                           # unequal dimensions row of 5 and row of 6
                                
    for i in range(rays):  # rays is not a number, did you mean len(rays[0])?
        for w in range(i): # w is not used anywhere
            estimate = rays[0][i]/(rays[0][i]+rays[1][i]) 
                           # estimate is overwritten at each iteration
    

    使用 numpy 的重点是避免使用 for 循环“手动”迭代数组元素。您应该将结果视为矩阵(或向量)之间的运算:

    例如(没有 for 循环):

    import numpy as np
    rays = np.array([[7.651e-03, 7.284e-03, 5.134e-03, 7.442e-03, 3.035e-03],
                     [2.373e-03, 6.877e-03, 4.809e-03, 2.870e-04, 3.175e-04]])
    
    estimates = rays[0]/(rays[0]+rays[1])
    print(estimates)
    [0.76326816 0.51437045 0.51634316 0.96286712 0.90529456]
    

    请注意,我从第二行中删除了最后一个值,因为 numpy 需要固定尺寸(即它不能有一行包含 5 个元素,另一行包含 6 个元素)

    您的嵌套循环for w in range(i),虽然您没有对w 做任何事情,但这表明您可能正在寻找累积和之间的比率。如果是这种情况,请使用 numpy 中的 cumsum 函数:

    estimates = np.cumsum(rays[0])/np.cumsum(rays[0]+rays[1])
    print(estimates)
    [0.76326816 0.61753153 0.58805087 0.65726163 0.67565445]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 2019-12-19
      相关资源
      最近更新 更多