【问题标题】:How to: Given a value (x,y,z) from an arry [U,x,y,z] output associated value of U如何:给定数组 [U,x,y,z] 中的值 (x,y,z) 输出 U 的关联值
【发布时间】:2019-07-20 23:21:48
【问题描述】:

这看起来很简单,但我正在寻找一种计算效率非常高(快速)的方法来做到这一点。我有一组数据,例如 N x 4 numpy 数组。

 data = [[U[0],x[0],y[0],z[0],
          U[1],x[1],y[1],z[1],
          ....
          U[N],x[N],y[N],z[N]]] 

我想做的是编写一个函数,它将某些给定元素 x[N],y[N],z[N] 组合的实际数值作为输入并输出 U[ 的数值N] 在同一行。 没有描述数据的分析函数,它是纯数字的,所以我只需要给出一些物理位置值的组合,比如 (x[51],y[51],z[51]),它将输出值U 位于具有 x[51]、y[51]、z[51] 的行中。下面给出了一个关于它应该如何工作的例子: 假设 x[51] = 2.4,y[51] = 6.3,z[51] = 9.45 和 U[51] = 13.665

 input >>  
 function(2.4,6.3,9.45)
 output >>
 13.665

因此,我的目标本质上是弄清楚如何编写能够以有效方式执行此操作的函数!

【问题讨论】:

  • 欢迎来到 Stack Overflow。不幸的是,你的问题并不清楚,至少对我来说是这样。你说你有“一组数据”——所有[U,x,y,z] 组织在什么数据结构中?这对您的问题很重要,而且它显然不能是 Python 集。 x2y6z9 到底是什么?你的意思是x[2] 等等?你是说U 是一个包含U0U1 等值的元组,还是你的意思是别的? U_2,6,9 是什么意思--你的意思是 U(2, 6, 9) 吗?等等。请使用 Python 符号和数据结构重写并澄清您的问题。
  • 你能解释一下你是如何得到 f(2.4,6.3,9.45)=13.665 的吗?它背后的作用是什么?如果您不提供关系,则无法优化或编码未知
  • 谢谢!我已经编辑了这个问题,希望现在更清楚了!任何帮助表示赞赏
  • data 是否很长,您希望搜索次数与data 的长度相似,多还是少?针对不同的情况有不同的算法。例如,如果您要进行大量搜索,您可以将 U 值存储在以 (x[i], y[i], z[i]) 为键的字典中。这需要一些时间来设置,但会立即为您提供搜索结果。

标签: python arrays data-manipulation


【解决方案1】:

如果您希望进行大量搜索,可以将 U 值存储在字典中,并使用 xyz 值查找它们,如下所示:

import numpy as np
data = np.array([
    [ 1.234, 3.7, 9.1, 2.74],
    [13.665, 2.4, 6.3, 9.45],
    [12.431, 8.1, 5.3, 4.25]
])
search_dict = dict(zip(map(tuple, data[:, 1:4]), data[:, 0]))
# or search_dict = {tuple(row[1:4]): row[0] for row in data}
search_dict[(2.4, 6.3, 9.45)]
# 13.665

另外,这对 pandas 来说是个好工作:

import pandas as pd
df = pd.DataFrame(data, columns=['U', 'x', 'y', 'z']).set_index(['x', 'y', 'z'])
df.loc[(2.4, 6.3, 9.45), 'U']

构建字典或 DataFrame 将需要一些时间和内存,但无论data 的长度如何,每次搜索都会获得非常快的结果。

如果您的数组很大且搜索量不多,则可以使用蛮力搜索:

matched_rows = (data[:, 1:4]==np.array([2.4, 6.3, 9.45])).all(axis=1)
data[matched_rows, 0]
# array([13.665])

【讨论】:

  • 一定会试一试的!谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多