x[x<;2]=0在Python中是什么意思?

x[x<;2]=0在Python中是什么意思?,python,python-2.7,numpy,Python,Python 2.7,Numpy,我遇到了一些代码,代码行与 x[x<2]=0 x[x>>x=[1,2,3,4,5] >>>x[x>>x[x>>x[x>2] 2. >>>x[x>>x [0, 2, 3, 4, 5] >>x=[1,2,3,4,5] >>>x>>x[错误] 1. >>>x[对] 2. bool被简单地转换为整数。索引为0或1。这仅在数组中有意义。列表的行为是无用的,并且特定于Python 2(而不是Python 3)。您可能需要再次检查原始对象是否确实是NumPy数组(请参见下文)而不是列表 但在这里的代

我遇到了一些代码,代码行与

x[x<2]=0
x[x>>x=[1,2,3,4,5]
>>>x[x>>x[x>>x[x>2]
2.
>>>x[x>>x
[0, 2, 3, 4, 5]
>>x=[1,2,3,4,5]
>>>x>>x[错误]
1.
>>>x[对]
2.

bool被简单地转换为整数。索引为0或1。

这仅在数组中有意义。列表的行为是无用的,并且特定于Python 2(而不是Python 3)。您可能需要再次检查原始对象是否确实是NumPy数组(请参见下文)而不是列表

但在这里的代码中,x是一个简单的列表


您问题中的原始代码仅适用于Python 2。如果在Python 2中
x
列表
,则比较
x
False
如果
y
int
eger。这是因为将列表与整数进行比较没有意义。但是在Python 2中,如果操作数不可比较,在CPython中,比较基于;此外,在混合类型比较中,所有数字都排在第一位。这在CPython 2的文档中甚至没有详细说明,不同的Python 2实现可能会给出不同的结果。即
[1,2,3,4,5]<2
的计算结果为
False
,因为
2
是一个数字,因此比CPython中的
列表
小。这种混合比较最终被删除,并在Python 3.0中被删除



现在,
的结果还有一个用途:代码高尔夫。代码高尔夫是用尽可能少的源代码字节编写解决某些问题的程序的艺术

return(a,b)[c<d]

return(a,b)[c一般来说,它可能意味着任何东西。已经解释了如果
x
是一个
列表
numpy.ndarray
,它意味着什么,但通常它只取决于比较运算符(
,…)以及get/set项(
[…]
-语法)是如何实现的

x.__getitem__(x.__lt__(2))      # this is what x[x < 2] means!
x.__setitem__(x.__lt__(2), 0)   # this is what x[x < 2] = 0 means!
现在让我们看看如果你使用它会发生什么:

>>> a = Test([1,2,3])
>>> a
Test ([1, 2, 3])
>>> a < 2  # calls __lt__
Test ([True, False, False])
>>> a[Test([True, False, False])] # calls __getitem__
Test ([1])
>>> a[a < 2] # or short form
Test ([1])

>>> a[a < 2] = 0  # calls __setitem__
>>> a
Test ([0, 2, 3])
>a=测试([1,2,3])
>>>a
测试([1,2,3])
>>>a<2#呼叫#__
测试([真、假、假])
>>>[Test([True,False,False])#调用uu getitem__
测试([1])
>>>a[a<2]#或缩写形式
测试([1])
>>>[a<2]=0调用集合项__
>>>a
测试([0,2,3])


请注意,这只是一种可能性。您可以自由地实现几乎所有您想要的东西。

您可能会提到
x
2
是,并且在不同的Python实现中,顺序可能会改变。我还想补充一点,这是一种聪明的方法,在我看来应该避免。明确地做到这一点OP不得不问这个问题的事实支持我的观点。你能补充更多细节吗,为什么
x
bool
没有转换成整数,Python中的
bool
是一个整数只是为了澄清@AnttiHaapala对其他人的陈述,
bool
int
的子类。这样做是没有意义的h一个列表。这仅适用于NumPy数组或类似对象,它们的行为与实验中的行为或两个答案中解释的基于列表的行为完全不同。请注意,这在Python 3中不起作用。只有在比较有意义时才能比较类型。在Python 3中,此示例抛出
typerror:unorderable types:list()
。信息太少。我应该提到数组是一个numpy数组。我很震惊这得到了这么多的赞成票(尽管对于so格式来说这确实是一个好问题)。鉴于OP明确地说“我遇到了一些这样的代码…”,我认为您描述numpy布尔索引的答案非常有用-可能值得指出的是,如果OP向上滚动他们查看的代码,他们几乎肯定会看到numpy的
导入
。当然,这仍然是一种非常聪明的方法?(与之相比,
[0 if I<2 else I for I in x]
)或者这是Numpy鼓励的风格?@TimPederick:在Numpy中使用列表理解是一个非常糟糕的主意。它的速度要慢几十到几百倍,它不适用于任意维数组,更容易搞乱元素类型,而且它会创建一个列表而不是数组。布尔数组索引是完全正常的Timperick除了性能受到影响外,很可能是编写代码的人打算继续使用NumPy数组。
x[x
+False
嗨Perl,嗨JavaScript,大家好吗?@cat在JavaScript,Perl中,它将值转换为数字。在Python中,它是用于调用
\uuuu pos\uuuuu
操作码。我想你的意思是
\uuuu setitem\uuuuuu
,而不是你上一节中的
\uu getitem\uuuu
。我希望你不介意我的a不,我的意思是并且正在考虑
\uuuu getitem\uuuuuuuuuuuuuuu
,虽然同样可能是
\uuuuuu setitem\uuuuuuuuuu
\uuuuuuu delitem\uuuuuuuuuuuuuuuuu
高尔夫是编写程序的艺术
:”)细微的挑剔:布尔值不是整数,它只是一个整数(参见其他答案)我想说的是,使用任何东西对于逻辑上可解释的行为(如公认的答案)来说实在太笼统了。@PascalvKooten你不同意“任何东西”或广义的答案吗?我认为这是一个重要的观点,因为python中的大多数逻辑行为都是按惯例进行的。
>>> x = np.array([1., -1., -2., 3])
>>> x < 0
array([False,  True,  True, False], dtype=bool)
>>> x[x < 0] += 20   # All elements < 0 get increased by 20
>>> x
array([  1.,  19.,  18.,   3.]) # Only elements < 0 are affected
>>> isinstance(False, int)
True
>>> isinstance(True, int)
True
>>> False == 0
True
>>> True == 1
True
>>> False + 5
5
>>> True + 5
6
return(a,b)[c<d]
if c < d:
    return b
else:
    return a
x.__getitem__(x.__lt__(2))      # this is what x[x < 2] means!
x.__setitem__(x.__lt__(2), 0)   # this is what x[x < 2] = 0 means!
class Test:
    def __init__(self, value):
        self.value = value

    def __lt__(self, other):
        # You could do anything in here. For example create a new list indicating if that 
        # element is less than the other value
        res = [item < other for item in self.value]
        return self.__class__(res)

    def __repr__(self):
        return '{0} ({1})'.format(self.__class__.__name__, self.value)

    def __getitem__(self, item):
        # If you index with an instance of this class use "boolean-indexing"
        if isinstance(item, Test):
            res = self.__class__([i for i, index in zip(self.value, item) if index])
            return res
        # Something else was given just try to use it on the value
        return self.value[item]

    def __setitem__(self, item, value):
        if isinstance(item, Test):
            self.value = [i if not index else value for i, index in zip(self.value, item)]
        else:
            self.value[item] = value
>>> a = Test([1,2,3])
>>> a
Test ([1, 2, 3])
>>> a < 2  # calls __lt__
Test ([True, False, False])
>>> a[Test([True, False, False])] # calls __getitem__
Test ([1])
>>> a[a < 2] # or short form
Test ([1])

>>> a[a < 2] = 0  # calls __setitem__
>>> a
Test ([0, 2, 3])