使用列表进行逻辑索引

use*_*239 8 python list

我有一个我正在浏览的程序和本节

temp = [1,2,3,4,5,6]
temp[temp!=1]=0
print temp
Run Code Online (Sandbox Code Playgroud)

如果运行会给出结果:

[1, 0, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

我需要帮助了解导致此结果的代码中发生了什么.

Ser*_*dev 11

temp在你的例子中是一个list,显然不等于1.因此表达式

 temp[temp != 1] = 0
Run Code Online (Sandbox Code Playgroud)

实际上是

temp[True] = 0  # or, since booleans are also integers in CPython
temp[1] = 0
Run Code Online (Sandbox Code Playgroud)

转换temp为NumPy数组以获得所需的广播行为

>>> import numpy as np
>>> temp = np.array([1,2,3,4,5,6])
>>> temp[temp != 1] = 0
>>> temp 
array([1, 0, 0, 0, 0, 0])
Run Code Online (Sandbox Code Playgroud)


Pad*_*ham 7

正如已经解释过的那样,您将使用与返回True的列表进行比较的结果来设置第二个元素,因为bool是int的子类。您有一个列表而不是一个numpy数组,因此如果要更改它,则需要对其进行迭代,这可以使用if / els e逻辑使用列表理解来完成:

temp = [1,2,3,4,5,6]
temp[:] = [0 if ele != 1 else ele for ele in temp ]
Run Code Online (Sandbox Code Playgroud)

这会给你:

[1, 0, 0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

或使用生成器表达式:

temp[:] = (0 if ele != 1 else ele for ele in temp)
Run Code Online (Sandbox Code Playgroud)