- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个存储为二维 numpy 数组的距离矩阵。我正在寻找一种有效的方法来为人口中的每个用户提取包含最接近的 n 匹配详细信息的摘要。该摘要最终将以 JSON 格式提供,因此我希望以嵌套列表/字典的形式提供它(示例输出稍微往下)。
以下最小示例(5 x 5 距离矩阵)演示了我正在使用的内容:
[[ inf 0.30330249 0.41690763 0.11468943 0.27026611]
[0.30330249 inf 0.72021012 0.41799192 0.5735686 ]
[0.41690763 0.72021012 inf 0.3022182 0.14664152]
[0.11468943 0.41799192 0.3022182 inf 0.15557668]
[0.27026611 0.5735686 0.14664152 0.15557668 inf]]
假设我们还可以访问与距离矩阵的行/列相对应的标签列表。生成此示例距离矩阵 dm
和标签 users
的代码如下:
import numpy as np
from scipy.spatial.distance import squareform, pdist
n = 5 # Population size
np.random.seed(1)
users = ['User {}'.format(i) for i in range(1, n+1)]
dm = squareform(pdist(np.random.random((n, 1))))
np.fill_diagonal(dm, np.inf)
假设我们想要为每个用户找到最接近的 2 个匹配项。通过查看距离矩阵,我们可以看到对于“用户 1”,他们最接近的匹配项是“用户 4”(0.11468943
),然后是“用户 5”(0.27026611
) .我想要的输出如下:
{
"User 1": [
{
"Main": "User 1",
"Other": "User 4",
"Distance": 0.11468943207073423
},
{
"Main": "User 1",
"Other": "User 5",
"Distance": 0.27026611388546096
}
],
"User 2": [
# redacted
],
"User 3": [
# redacted
],
"User 4": [
# redacted
],
"User 5": [
{
"Main": "User 5",
"Other": "User 3",
"Distance": 0.14664151599976816
},
{
"Main": "User 5",
"Other": "User 4",
"Distance": 0.15557668181472672
}
]
}
(我意识到上面的 "Main"
键有点多余,我将它们包括在内是为了让数据更容易在前端使用)
我能够使用以下代码实现预期的结果:
import pandas as pd
n_per_user = 2 # Number of closest users to find per user
# Get row-wise indices of n smallest distances
indices = np.argpartition(dm, range(n_per_user), axis=1)[:, :n_per_user]
# Each of these comprehensions is for one column of the DataFrame which will be built shortly
users_main = (user for user in users for i in range(n_per_user))
users_other = (users[i] for i in indices.flatten())
distances = (dm[i, j] for i, row in enumerate(indices) for j in row)
# Construct the DataFrame
df = pd.DataFrame(list(zip(users_main, users_other, distances)), columns=['Main', 'Other', 'Distance'])
# Main Other Distance
# 0 User 1 User 4 0.114689
# 1 User 1 User 5 0.270266
# 2 User 2 User 1 0.303302
# 3 User 2 User 4 0.417992
# 4 User 3 User 5 0.146642
# 5 User 3 User 4 0.302218
# 6 User 4 User 1 0.114689
# 7 User 4 User 5 0.155577
# 8 User 5 User 3 0.146642
# 9 User 5 User 4 0.155577
results = {x: y.to_dict('records') for x, y in df.groupby('Main', sort=False)}
这适用于像这样的小数据集,但我真正的 dm
是 10k x 10k 而不是 5 x 5,我希望每个用户前 25 个而不是前 2 个(适当大小的示例可以通过在上面的代码中将 n
设置为 10000
并将 n_per_user
设置为 25
来生成。
当前状态下的整个程序在我的机器上运行大约 10 秒,最后一步(将 DataFrame 转换为嵌套字典)占用了一半的时间。鉴于我希望在最终应用程序中非常频繁地执行这些步骤,我正在寻找更有效的解决方案。我意识到我本可以在最后一步寻求帮助,因为它是造成瓶颈的原因,但我怀疑可能有更好的解决方案可以完全绕过创建 DataFrame 的需要,这就是为什么我包含了这么多上下文。
最佳答案
在这里回答我自己的问题,因为在睡过头之后我想出了一个解决方案,可以直接从生成器转到字典,绕过对 DataFrame 的需要。可以将我原始代码的最后两行替换为以下代码,以提高约 20 倍的速度:
from collections import defaultdict
results = defaultdict(list)
for main, other, distance in zip(users_main, users_other, distances):
results[main].append({"Main": main, "Other": other, "Distance": distance})
关于python - 从 numpy 距离矩阵高效生成 JSON 摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50138988/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!