功能
np.partition的工作流程可以看做是先对数组排序(升序),然后以索引是i的元素为基准,将元素分成两部分,即大于该元素的放在其后面,小于该元素的放在其前面,这里有点类似于快排,具体看下面的类子:
import numpy as np
result = np.random.randint(1, 13,(6,4))
print(result)
result1 = np.sort(result,axis=0)
print(result1)
result2 = np.partition(result, kth=2, axis=0)
print(result2)
这里我们是按列(axis=0)进行的排序
为了验证我们的想法先对原始二维数组进行排序得到result1
然后以每一列索引为2即第3个元素进行基准将每一列划分为两部分
比如第一列排序后的第三个元素是7,那么大于它的都放在了其后面,小于其的都放在了其前面
同理第二列排序后的第三个元素是8
第三列排序后的第三个元素是3等等
还有一个问题需要注意的就是放在其后或其前的数组是无序的如第一列的10,10,8
它通常的应用是找出最值
假设现在我们找每一列第二小的数,我们就可以这么做:
import numpy as np
result = np.random.randint(1, 13,(6,4))
print(result)
result1 = np.sort(result,axis=0)
print(result1)
result2 = np.partition(result, kth=1, axis=0)[1]
print(result2)
当然啦,其没有考虑去重的情况,即比如第二列按说只有2,4,6,11,12这几种数据,第二小的数据是4
同理我们还可以选取每一列第二大的数据:
import numpy as np
result = np.random.randint(1, 13,(6,4))
print(result)
result1 = np.sort(result,axis=0)
print(result1)
result2 = np.partition(result, kth=-2, axis=0)[-2]
print(result2)
为什么
为什么找第K个最值要这么做呢?原因就是该方法比较快,numpy.partition内部其实并不是先对数组进行排序的,而是只考虑第K个最值,而不管其前后数组的顺序,所以比较快,有兴趣的可以看一下源码,总之找k最值,这是一个可选的方案吧