【问题标题】:Difficulties expressing list comprehension as numpy expression [duplicate]将列表理解表达为 numpy 表达式的困难[重复]
【发布时间】:2019-12-12 09:10:48
【问题描述】:

我有一个简单的嵌套列表理解,但无法理解我应该如何将它写入干净的 numpy 代码。 (我必须这样做,以提高速度)

这是我的列表理解:

import numpy as np

all_as = np.arange(-1, 1+0.01, 0.01)
all_cs = np.arange(-1, 1+0.01, 0.01)

out = [(a,c) for c in all_cs for a in all_as]

out = np.array(out) # obviously not very efficient...

我确定有一种方法可以不首先创建列表,但我不知道如何。

我知道有很多类似的问题,但没有一个对我有真正的帮助。

【问题讨论】:

  • 我不知道它在性能方面是否有任何改变,但您可以删除一个列表声明并执行out = [(a,c) for c in all_as for a in all_as],这似乎与前一个表达式相同。
  • 甚至this one 有一个很好的规范答案(不是检查答案,第二个),下面是@PaulPanzer 更快的答案。

标签: python arrays performance numpy list-comprehension


【解决方案1】:

您应该使用来自 itertools 的 product

from itertools import product
out = list(product(all_as, all_cs))

例子

>>> data1 = np.arange(0,3)
>>> data2 = np.arange(4,7)

>>> data1
array([0, 1, 2])
>>> data2
array([4, 5, 6])

>>> list(product(data2,data1))
[(4, 0), (4, 1), (4, 2), (5, 0), (5, 1), (5, 2), (6, 0), (6, 1), (6, 2)]

>>> list(product(data1,data2))
[(0, 4), (0, 5), (0, 6), (1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6)]

【讨论】:

  • 够快了,谢谢。但是,它返回 out_ji 而不是 out_ij。
  • 好的。更新了订单
  • 很高兴为您提供帮助
  • 好像没有改变
  • 发布了一个例子。这不是你所期待的吗?
【解决方案2】:

您可以尝试以下 Scikit-Learn 实用程序 function

from sklearn.utils.extmath import cartesian

cartesian([all_as, all_cs])

返回

array([[-1.  , -1.  ],
       [-1.  , -0.99],
       [-1.  , -0.98],
       ...,
       [ 1.  ,  0.98],
       [ 1.  ,  0.99],
       [ 1.  ,  1.  ]])

【讨论】:

    猜你喜欢
    • 2013-03-20
    • 2019-05-17
    • 2023-04-04
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多