【问题标题】:What does `[b for a in x for b in a if not b==k]` mean?`[b for a in x for b in a if not b==k] 是什么意思?
【发布时间】:2017-03-04 22:12:34
【问题描述】:

绝对被难住了:

indices = numpy.array([b for a in x for b in a if not b==k])

x 是整数的二维数组和k 是整数的上下文中,我应该如何阅读[b for a in x for b in a if not b==k] 的任何指针?还是用括号括起来帮助我理解事物的优先级?

【问题讨论】:

标签: python numpy list-comprehension


【解决方案1】:

这相当于:

result = []
for a in x:
    for b in a:
        if not b == k:
            result.append(b)
indices = numpy.array(result)

您可以从左侧阅读列表推导式来编写并将它们转换为单独的 for 循环。

【讨论】:

    【解决方案2】:

    它将x 数组的一维展平(我认为代码假定x 是一个二维数组)并删除整数k 的所有出现。例如:

    >>> import numpy as np
    
    >>> x = np.arange(20).reshape(4, 5)  # makes it a 2D array
    >>> x
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19]])
    >>> k = 4
    
    >>> inds = np.array([b for a in x for b in a if not b==k])
    >>> inds
    array([ 0,  1,  2,  3,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
    

    请注意,您的代码并没有真正使用强大而快速的 NumPy 功能。如果x 是一个数组,您可以简单地使用:

    >>> x[x!=k]  # make it 1D and keep only values != k
    array([ 0,  1,  2,  3,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
    

    【讨论】:

    • 这个命令对我来说真的没有意义。感觉就像德国数字:123hundred three and twenty。我希望[b for b in a for a in x if not b==k]
    • @EricDuminil 列表理解的结构与您编写的真实for-loops 具有相同的结构。首先是外循环for a in x,然后是内循环for b in a
    • @EricDuminil 好吧,不幸的是,OP 没有在理解中使用换行符。我也认为它不那么可读。然而,总是有itertools.chain,这使得双循环几乎没有必要:[item for item in itertools.chain.from_iterable(x) if item != k]。但如果使用NumPyx[x!=k] 会更好。 :)
    • @EricDuminil 如果使用换行符,它看起来也很奇怪...gist.github.com/MSeifert04/54ec072097441d5a8ebc33967f632a97 :)
    • 我更多地抱怨这种 Python 语法设计,而不是 OP 的代码。但是感谢您的cmets。无论如何,我只是在吹毛求疵。来自 Ruby 的列表推导令人耳目一新,但恕我直言,双重推导可能更漂亮。对于换行符,我在谈论经典的 for 循环。对换行的理解确实很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 2023-04-05
    • 2018-01-29
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多