numpy数组通过for循环替换阈值以上元素为nan不生效问题咨询
问题原因
- 嵌套循环中取出的
item是数组元素的临时值拷贝,修改该变量不会写入原数组。你仅修改了临时变量的存储内容,完全没有对array2的内存空间做修改,所以循环结束后array2的数值没有任何变化。 - 补充说明:你代码中
array1 = array2 = np.arange(9).reshape(3,3)之后执行的array2 = array2.astype("float")会返回新的独立数组,此时array1和array2已经是指向不同内存的变量,最终np.array_equal返回True只是因为二者数值未发生修改时整型和浮点型的数值刚好相等,和赋值失败的核心原因无关。
推荐实现方案
Numpy设计了向量化操作替代循环,你可以直接用布尔索引完成阈值过滤,执行效率远高于手写循环:
import numpy as np array1 = np.arange(9).reshape(3,3) array2 = array1.astype("float") # 直接对符合条件的位置批量赋值 array2[array2 > 3.0] = np.nan print(np.array_equal(array1, array2))
如果必须使用循环实现,需要通过索引定位到原数组的对应位置再修改:
for i in range(array2.shape[0]): for j in range(array2.shape[1]): if array2[i, j] > 3.0: array2[i, j] = np.nan
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

