我有一个我正在浏览的程序和本节
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)
正如已经解释过的那样,您将使用与返回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)