【问题标题】:how to work with loop and break statement over numpy ndarray如何在 numpy ndarray 上使用循环和中断语句
【发布时间】:2021-12-04 05:29:47
【问题描述】:

我有这个 a 的数据数组:

>>>a
array([[1., 2., 3.],
      [4., 5., 6.]], dtype=float32)

现在我想对数据做这样的事情:

>>>for n in range (1,4):
>>>    a += 2
>>>    print(a)
[[3. 4. 5.]
 [6. 7. 8.]]
[[ 5.  6.  7.]
 [ 8.  9. 10.]]
[[ 7.  8.  9.]
 [10. 11. 12.]]

这会给我a的最终结果:

>>> a
array([[ 7.,  8.,  9.],
       [10., 11., 12.]], dtype=float32)

如果我希望每个元素的迭代在值 > 8 时停止, 这可能会给我这样的最终结果:

>>> a
array([[7., 8., 7.],
      [8., 7., 8.]], dtype=float32)

怎么做?

谢谢!

【问题讨论】:

  • 您的循环发生在a+= 2 计算之外。您可以限制值,但不能停止计算。
  • a 的元素不会单独循环。所有a 在每个+= 处进行评估

标签: python numpy for-loop conditional-statements break


【解决方案1】:

使用np.where

代码

a = np.array([[1., 2., 3.],
      [4., 5., 6.]], dtype=np.float32)

for i in range(1, 4):
    a = np.where(a + 2 <= 8, a+2, a)

替代方案(需要 Python 3.8+)

您可以使用 Walrus 运算符来避免计算 a + 2 两次:

for i in range(1, 4):
    a = np.where((p:=a + 2) <= 8, p, a)

输出

print(a)
array([[7., 8., 7.],
       [8., 7., 8.]], dtype=float32)

说明

Syntax :numpy.where(condition[, x, y])
Parameters:
condition : When True, yield x, otherwise yield y.

【讨论】:

    【解决方案2】:

    一种方法是:

    import numpy as np
    
    a = np.array([[1., 2., 3.],
                  [4., 5., 6.]], dtype=np.float32)
    
    for n in range(1, 4):
        a += 2 * ((a + 2) <= 8)
    
    print(a)
    

    输出

    [[7. 8. 7.]
     [8. 7. 8.]]
    

    这个想法是将 2 乘以一个布尔掩码,如果 2 可以添加到 a 的元素中,则该掩码为 1,否则为 0。

    作为替代方案,您可以通过执行以下操作完全跳过 for 循环:

    a = 8 - (a % 2)
    print(a)
    

    输出

    [[7. 8. 7.]
     [8. 7. 8.]]
    

    上述解决方案是基于a中的偶数最终为8,奇数为7的事实,这当然是假设a中的所有数字都小于8

    【讨论】:

    • 感谢您的建议!但我实际上想了解如何使用 for 循环内的给定条件评估每个元素的值,谢谢!
    • 什么意思?
    • 嗯,不,这是我的错。我想我只是不清楚你的答案,但我现在明白了。感谢您的帮助! :)
    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 2023-03-16
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多