python - 批量计算给定数组与mongodb数据库数组之间的欧氏距离

标签 python arrays mongodb pymongo

我正在尝试做什么:

计算Euclidean distance给定数组(例如 [0,1.2,0,1.5,0,0.3,1,2,1])与具有以下结构的集合对象内的所有其他数组之间:

{'myname':'001','myarray':[0,1,2.0,1,0,0.3,1,2,1]}

我如何创建集合:

from pymongo import MongoClient

mydata = [{'myname':'001',
          'myarray':[0,1,2.0,1,0,0.3,1,2,1]},
          {'myname':'002',
          'myarray':[0,0,0,1,1,0.7,1,2,1]},
          {'myname':'003',
          'myarray':[0,1,2,1.2,1,2,1,2,1]},
          {'myname':'004',
          'myarray':[0,0,2,0,0,0,1.3,2,1]},
          {'myname':'005',
          'myarray':[0,1,0.5,1,0,0,1,2,1]},
          ]


client = MongoClient('localhost', 27017)
db = client['mydb']
collection = db['mydata']

for data in mydata:
    collection.insert_one(data)

我在其他解决方案中发现的内容:

我看到了很多如何使用 MongoDB 计算地理空间距离的示例,但不幸的是,它看起来只适用于 2 元素数组(如 [经度,纬度])。在这些情况下,人们使用 $near$geoNear。 我还发现了一些关于 map-reduce 函数的内容,这些函数对于这种情况应该很有用,但我是 MongoDB 的新手,我不知道如何通过集合创建和执行函数。

拥有什么就太好了:

使用上面的代码示例的 Python 代码返回每个对象的列表及其与给定数组的距离,例如: {'我的名字':'001','我的距离':15。}

最佳答案

遵循 map-reduce syntax in pymongo ,我们需要作为字符串传入的map和reduce JS函数。指定点wrt。为了计算距离,我们需要将一个附加变量 (target) 传递到函数作用域中。总之,操作看起来像这样:

from bson.code import Code

map = Code("function () {....")
reduce = Code("function (key, values) {...")

point_array = collection.find({ 'myname': '005' }, { 'myarray': 1 })[0]['myarray']
result = collection.map_reduce(map, reduce, "myresults", scope={"target": point_array})

可能有一百万种方法来拆分 Map-Reduce 函数,但我是这样做的。首先,我们有 map 函数,它会发出一个数组和“目标”数组之间的一系列元素差异以及一个键。我假设 myname 是唯一的,所以我用它作为键:

# map
function () {
  var i;
  for (i = 0; i < this.myarray.length; i++) {
    emit(this.myname, this.myarray[i] - target[i]);
  }
}

然后,为了获得最终距离,reduce 函数获取从映射步骤发出的差异,对它们的平方求和,然后根据以下公式取该总和的平方根:

# reduce
function (key, values) {
  var total = 0;
  var i = 0;
  for (i = 0; i < values.length; i++) {
    total = total + Math.pow(values[i],2);
  }
  return Math.sqrt(total);
}

结果的输出是:

{'_id': '001', 'value': 1.5297058540778354}
{'_id': '002', 'value': 1.6552945357246849}
{'_id': '003', 'value': 2.7}
{'_id': '004', 'value': 2.083266665599966}
{'_id': '005', 'value': 0.0}

关于python - 批量计算给定数组与mongodb数据库数组之间的欧氏距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53786026/

相关文章:

javascript - Mongoose - 保存时更新引用的文档

javascript - 如何使用 Mongoose/Node.js 删除数组中的项目

python - 使用 PIL 加载和评估像素

javascript - 数组中的快速元素验证

python - 从 numpy.where() 获取值的位置作为单个值并将其附加到另一个数组

node.js - 无法设置未定义的属性(设置 'login' )

python - 按形状和大小分类

python - zfec 实用程序测试中的 Ascii 错误

python - Python 2.6 与 2.7 中的浮点行为

javascript - 如何使用 Javascript 对动态数组中的项目进行分组