调整NumPy方法调用顺序为何返回None及输出差异?
NumPy排序返回None的原因及涉及的编程概念
问题复现
代码:
import numpy as np a = np.array([[1,4],[3,1]]) np_array = np.sort(a.flatten()) print(np_array) np_array2 = a.flatten().sort() print(np_array2)
实际输出:
[1 1 3 4] None
预期输出:
[1 1 3 4] [1 1 3 4]
差异原因
两种写法的核心区别在于使用的是非原地排序函数还是原地排序方法:
np.sort(a.flatten()):np.sort()是NumPy的顶级函数,属于非原地操作。它会先对a.flatten()返回的扁平化数组创建副本,对副本完成排序后,返回这个新的排序好的数组。因此np_array能接收到正确的排序结果。a.flatten().sort():这里调用的是NumPy数组对象的sort()方法,属于原地操作。它会直接修改调用它的那个扁平化数组本身,不会生成新数组,方法执行后返回None。所以np_array2被赋值为None,打印出来就是这个结果。
涉及的编程概念
核心是原地操作(in-place operation)与非原地操作的区别:
- 原地操作:直接修改原对象的内容,不返回新对象(通常返回
None),优势是节省内存,避免不必要的数据复制。 - 非原地操作:不改动原对象,而是创建一个新的对象来存储处理后的结果并返回,原对象保持初始状态。
修正方案
如果想让第二种写法得到预期结果,可以先保存扁平化后的数组,再执行原地排序:
temp_arr = a.flatten() temp_arr.sort() print(temp_arr) # 输出:[1 1 3 4]
内容的提问来源于stack exchange,提问作者Rama
相关产品推荐
相关产品推荐

