【问题标题】:Converting for-loop into vectorized form in Python在 Python 中将 for 循环转换为矢量化形式
【发布时间】:2023-02-05 16:00:00
【问题描述】:

我试图用矢量化形式替换下面的 for 循环,但出现错误。我如何解决它?

for i in range(0,len(sigma[0])):
             if(sigma[0][i]<=threshold): 
                    sigma[0][i]=threshold

我使用的矢量化形式是

sigma[sigma <= threshold] = threshold

我得到的错误

in <module>
    sigma[sigma <= threshold] = threshold

TypeError: '<=' not supported between instances of 'list' and 'float'

【问题讨论】:

  • 基本 Python 不支持该操作。你需要一个像 numpy 这样的包来进行数组编程。
  • sigma[0][sigma[0] &lt;= threshold] = threshold 能解决你的问题吗?您使用什么类型的数据和模块?
  • @AEinstein 请分享更多关于 sigma 的信息。它是列表列表还是其他?你最终想遍历所有sigma吗?或者真的只是sigma[0]

标签: python for-loop vectorization


【解决方案1】:

在没有额外依赖的情况下,你能做的最好的事情就是列表理解:

sigma[0] = [max(threshold, x) for x in sigma[0]]

更好的是,如 cmets 中所建议的那样,为此使用 Numpy(这将操作应用于整个数组,就目前而言):

import numpy as np
sigma_arr = np.array(sigma)

sigma_arr[sigma_arr <= threshold] = threshold

或者:

sigma_arr.clip(min=threshold, out=sigma_arr)

【讨论】:

  • 不应该是np.array(sigma[0])吗?
  • @claudio 因此“这将操作应用于整个数组”
  • 问题是:sigma 是一个数组吗?如果 sigma 是一个 numpy 数组列表怎么办?
猜你喜欢
  • 2021-04-14
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 2019-12-02
  • 1970-01-01
  • 2019-02-24
相关资源
最近更新 更多