numpy-np.partition的使用

本文解析了NumPy库中的partition函数,演示如何根据指定位置对数组进行排序划分,通过实例展示了函数的工作原理,并介绍了元组参数的使用。关键概念包括基准元素、前后元素移动和多位置划分。

官方文档:https://numpy.org/doc/stable/reference/generated/numpy.partition.html

官方给出的说明是:

即:以第'k-th'位置为基准,该位置的元素位于对原始数组排序之后的位置,大于该元素值的元素被放置在该元素的后面,小于该元素值的元素被放置在该元素的前面,前后两端的元素排列顺序无要求。

代码测试:

a = np.array([3, 4, 2, 1])  # [1, 2, 3, 4]
print(a)
print(np.partition(a, 3))
print(np.partition(a, (1, 3)))

'''
输出:
[3 4 2 1]
[2 1 3 4]
[1 2 3 4]
'''

数组[3, 4, 2, 1]排序之后的顺序是[1, 2, 3, 4],在位置'3'的元素数值为'3',小于'3'的元素'1, 2'被移动到前面,'4'被移动到后面,得到结果。

当参数为元祖'(1, 3)'时,即是以位置'1'和'3'为基准,对原数组进行移动处理。

 

参考:

https://stackoverflow.com/questions/41484104/how-numpy-partition-work

https://blog.youkuaiyun.com/weixin_42001089/article/details/89204112

 

 

import numpy as np import time def similarity_to_distance(similarity_matrix, sigma=1.0, eps=1e-10): """ 带稳定性处理的相似度转距离 """ similarity_matrix = np.clip(similarity_matrix, eps, 1) return np.sqrt(-2 * sigma ** 2 * np.log(similarity_matrix)) class FuzzClusterUtil: def __init__(self, stability_eps=1e-10, ap_damping=0.7): self.eps = stability_eps self.ap_damping = ap_damping # AP消息传递阻尼系数 def _ap_affinity_matrix(self, similarity_matrix): """ 生成AP专用的亲和力矩阵 """ np.fill_diagonal(similarity_matrix, np.median(similarity_matrix)) return similarity_matrix def _ap_message_passing(self, S, max_iter=200, conv_iter=15): """ 改进的AP消息传递核心算法 """ n = S.shape[0] R = np.zeros((n, n)) # Responsibility矩阵 A = np.zeros((n, n)) # Availability矩阵 prev_exemplars = None stable_count = 0 for it in range(max_iter): # 计算Responsibility AS = A + S max_col = np.max(AS, axis=1, keepdims=True) R_new = S - max_col np.fill_diagonal(R_new, S.diagonal() - np.max(AS - np.diag(np.diag(AS)))) # 应用阻尼系数 R = self.ap_damping * R + (1 - self.ap_damping) * R_new # 计算Availability Rp = np.clip(R, -1e10, 0) # 防止数值溢出 A_new = np.sum(Rp, axis=0, keepdims=True) - Rp np.fill_diagonal(A_new, np.sum(Rp, axis=0) - Rp.diagonal()) A_new = np.minimum(A_new, 0) # 应用阻尼系数 A = self.ap_damping * A + (1 - self.ap_damping) * A_new # 动态收敛检测 exemplars = np.unique(np.where(A + R > 0)[0]) if prev_exemplars is not None and set(exemplars) == set(prev_exemplars): stable_count += 1 if stable_count >= conv_iter: break else: stable_count = 0 prev_exemplars = exemplars.copy() # 最终Medoid选择 medoid_scores = A.diago
03-17
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值