【问题标题】:Iterate elements of array without using for loop在不使用 for 循环的情况下迭代数组元素
【发布时间】:2020-02-26 04:16:31
【问题描述】:

我有一个包含 100 万个正值或负值的数组。

A=[1.3,4,5,6.4,-0.3,-2,-----]

如果元素是负数,我必须用 0 替换值,如果元素是正数,我必须用 1 替换。

我不想将它用于循环,因为它需要很多时间。

这是我当前的代码:

 for i in range(len(arr)):
     if arr[i] > 0:
         arr[i] = 1
     else:
         arr[i] = 0

【问题讨论】:

  • 我不想将它用于循环,因为它会花费很多时间 可能有办法加快你的代码,但没有办法避免一个循环。
  • dataframepandas 库中使用的数据结构的名称。它不在您的代码中。

标签: python arrays dataframe


【解决方案1】:

没有 numpy 的解决方案。但取而代之的是list comprehension

arr = [0 if a < 0 else 1 for a in arr]

【讨论】:

  • 哪里有for - 哪里有loop。这只是编写循环的一种“更酷”的方式。
  • @Aryerez 看看我发布的链接。列表推导比标准 for 循环快得多,因为该行只需要解释一次,而不是每次 for 循环到达它时
  • @UliSotschok 在 CPython 中,列表解析更快,因为它们不必调用 append 函数,而是使用字节码指令 LIST_APPEND。我不确定您所说的“只需要解释一次”是什么意思,CPython 被编译为字节码,循环中的字节码将以任何一种方式在每次迭代中执行。您可以将它们与 dis.dis 进行比较,以检查为循环生成的字节码与列表理解,除了 LIST_APPEND 而不是 append 函数调用之外,它几乎相同。
【解决方案2】:

您也可以使用list comprehensions 并使用以下代码

arr = [1 if v > 0 else 0 for v in arr]

【讨论】:

  • 哪里有for - 哪里有loop。这只是编写循环的一种“更酷”的方式。
  • 我邀请您向我们展示一个无循环版本。一种或另一种方式会有一个循环 - 例如,显式或隐藏在一个 numpy 函数中。
  • 即使没有(并且有,例如通过将其转换为 numpy 数组),这并不意味着应该将列表理解视为非循环解决方案。
  • @Aryerez 虽然它不是一个非循环解决方案,但它仍然应该有所帮助,因为它更快并且不使用库。如果你可以使用 numpy 作为额外的库,你应该使用它,因为这将是最快的解决方案
【解决方案3】:
import numpy as np
arr = np.array([1.3,4,5,6.4,-0.3,-2])
arr = np.where(arr > 0, 1, 0)

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 2015-07-25
    • 2017-11-10
    • 2019-01-07
    相关资源
    最近更新 更多