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:] |
您可以使用
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]]) |
号
如果
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]]) |
。