在一个数组中搜索特定元素并复制另一个数组中的整个对应行
Posted
技术标签:
【中文标题】在一个数组中搜索特定元素并复制另一个数组中的整个对应行【英文标题】:Search for a specific element in one array and copy the entire corresponding row in other array 【发布时间】:2016-11-28 00:49:59 【问题描述】:我有以下问题,到目前为止我还没有找到任何有用的提示。
我有两个如下所示的数组:
sample_nodes = [[ ID_1 x1 y1 z1]
[ ID_2 x2 y2 z2]
[ ID_3 x3 y3 z4]
.
.
.
[ ID_n xn yn zn]]
和
sample_elements = [[[ ID_7 0 0 0]
[ ID_21 0 0 0]
[ ID_991 0 0 0]
[ ID_34 0 0 0]]
[[ ID_67 0 0 0]
[ ID_1 0 0 0]
[ ID_42 0 0 0]
[ ID_15 0 0 0]]
.
.
.
[[ ID_33 0 0 0]
[ ID_42 0 0 0]
[ ID_82 0 0 0]
[ ID_400 0 0 0]]]
sample_nodes 具有 sample_elements 所需的 x、y 和 z 坐标,其中 ID 以随机顺序排列。因此,我必须查看 sample_elements 数组中每一行的每个 ID,并从 sample_nodes 中找出对应的 x、y 和 z 坐标,并在与 ID 对应的 sample_elements 数组中再次将零值替换回。
我对 python 和 numpy 都很陌生,因此不知道该怎么做。提前感谢大家为解决这个问题提供的任何指示。
此外,sample_elements 中的所有他的 ID 都存在于 sample_nodes 中。仅在 sample_elements 中它们是随机排列的,因为它们是由名为 Gmsh 的网格划分软件生成的。我实际上是在尝试解析它的输出网格文件。
【问题讨论】:
那些IDs
是字符串还是数字?
它们是数字。
另外,来自 sample_elements 的所有 ID 是否都存在于 sample_nodes 的 IDs col 中?
没错。 sample_elements 中的所有 ID 都存在于 sample_nodes 中。仅在 sample_elements 中它们是随机排列的,因为它们是由名为 Gmsh 的网格划分软件生成的。我实际上是在尝试解析它的输出网格文件。
【参考方案1】:
您可以使用np.searchsorted
来形成原始的行顺序,然后简单地用它索引到sample_nodes
会给我们想要的输出。因此,我们会有这样的实现 -
sample_nodes[np.searchsorted(sample_nodes[:,0],sample_elements[:,0])]
示例运行 -
In [80]: sample_nodes
Out[80]:
array([[1, 3, 3, 6],
[3, 2, 4, 8],
[4, 2, 3, 4],
[5, 3, 0, 8],
[6, 8, 2, 3],
[7, 4, 6, 3],
[8, 3, 8, 4]])
In [81]: sample_elements
Out[81]:
array([[7, 0, 0, 0],
[5, 0, 0, 0],
[3, 0, 0, 0],
[6, 0, 0, 0]])
In [82]: sample_nodes[np.searchsorted(sample_nodes[:,0],sample_elements[:,0])]
Out[82]:
array([[7, 4, 6, 3],
[5, 3, 0, 8],
[3, 2, 4, 8],
[6, 8, 2, 3]])
如果sample_nodes
中的IDs
没有排序,我们需要使用可选参数sorter
和np.searchsorted
,像这样-
sidx = sample_nodes[:,0].argsort()
row_idx = np.searchsorted(sample_nodes[:,0],sample_elements[:,0],sorter=sidx)
out = sample_nodes[sidx[row_idx]]
示例运行 -
In [98]: sample_nodes
Out[98]:
array([[3, 3, 3, 6],
[5, 2, 4, 8],
[8, 2, 3, 4],
[1, 3, 0, 8],
[4, 8, 2, 3],
[7, 4, 6, 3],
[6, 3, 8, 4]])
In [99]: sample_elements
Out[99]:
array([[7, 0, 0, 0],
[5, 0, 0, 0],
[3, 0, 0, 0],
[6, 0, 0, 0]])
In [100]: out
Out[100]:
array([[7, 4, 6, 3],
[5, 2, 4, 8],
[3, 3, 3, 6],
[6, 3, 8, 4]])
【讨论】:
在我的情况下完美运行.. 谢谢.. 鞠躬.. :-)【参考方案2】:numpy_indexed 包具有解决问题关键步骤的功能(在另一个序列中查找一个序列的索引)。如果您不熟悉 numpy,并且完全关心效率,请务必阅读相关内容!
import numpy as np
import numpy_indexed as npi
sample_nodes = np.asarray(sample_nodes)
sample_elements = np.asarray(sample_elements)
idx = npi.indices(sample_nodes[:, 0], sample_elements[:, 0])
sample_elements[:, 1:] = sample_nodes[idx, 1:]
【讨论】:
这也对我有用。 Divakar 的解决方案无需安装软件包即可工作,因此我赞成他的解决方案。不过,非常感谢您抽出时间来回答。 不客气;性能特征应该与其他解决方案几乎相同,并且在 crtl-c/crtl-v 与 pip install 方面没有争论的味道:) 哈哈哈,这似乎总是一个简单的解决方案,不是吗?问题是,你的提示在我的笔记本电脑上工作,但我无法让它在我研究所的 PC 上工作,我没有管理员权限来安装“numpy_indexed”并且管理员正在休假,现在是学期假期等等。跨度> 啊是的,这很烦人。此线程中的答案可能对将来的此类事情有所帮助:***.com/questions/14179941/…以上是关于在一个数组中搜索特定元素并复制另一个数组中的整个对应行的主要内容,如果未能解决你的问题,请参考以下文章