关于python:在一个数组中搜索特定元素,并复制其他数组中的整个相应行

Search for a specific element in one array and copy the entire corresponding row in other array

我有以下问题,到目前为止我还没有找到任何有用的提示。

我有两个这样的数组:

1
2
3
4
5
6
7
sample_nodes = [[ ID_1    x1    y1    z1]
                [ ID_2    x2    y2    z2]
                [ ID_3    x3    y3    z4]
                .
                .
                .
                [ ID_n    xn    yn    zn]]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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]]]

样本_节点具有x、y和z坐标,这些坐标是样本_元素所需要的,其中id按随机顺序排列。因此,我必须查看sample_元素数组中每行的每个ID,并从sample_节点中找到相应的x、y和z坐标,然后在sample_元素数组中重新替换与ID对应的零值。

我对python和numpy都很陌生,因此,不知道该怎么做。提前感谢各位指点解决这个问题。

此外,示例元素中的所有HE ID都存在于示例节点中。只有在样本中,元素才会随机排列,因为它们是由一个称为gmsh的网格化软件生成的。我实际上正在尝试解析它的输出网格文件。


numpy_索引包具有解决问题关键步骤的功能(在另一个序列中查找一个序列的索引)。如果你不熟悉numpy,而且根本不关心效率,那么一定要仔细阅读它!

1
2
3
4
5
6
7
8
9
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:]


您可以使用np.searchsorted来形成原始的行顺序,然后用它简单地索引到sample_nodes中就可以得到所需的输出。因此,我们将有一个这样的实现-

1
sample_nodes[np.searchsorted(sample_nodes[:,0],sample_elements[:,0])]

样品运行-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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不是按顺序排序的,我们需要将可选参数sorternp.searchsorted一起使用,就像这样。-

1
2
3
sidx = sample_nodes[:,0].argsort()
row_idx = np.searchsorted(sample_nodes[:,0],sample_elements[:,0],sorter=sidx)
out = sample_nodes[sidx[row_idx]]

样品运行-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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]])