我有以下问题,到目前为止我还没有找到任何有用的提示。
我有两个这样的数组:
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]]]
号
样本_节点具有x、y和z坐标,这些坐标是样本_元素所需要的,其中id按随机顺序排列。因此,我必须查看sample_元素数组中每行的每个ID,并从sample_节点中找到相应的x、y和z坐标,然后在sample_元素数组中重新替换与ID对应的零值。
我对python和numpy都很陌生,因此,不知道该怎么做。提前感谢各位指点解决这个问题。
此外,示例元素中的所有HE ID都存在于示例节点中。只有在样本中,元素才会随机排列,因为它们是由一个称为gmsh的网格化软件生成的。我实际上正在尝试解析它的输出网格文件。
这些是IDs字符串还是数字?
它们是数字。
此外,样本节点的ids col中是否存在来自样本元素的所有id?
确切地。样本_元素中的所有ID都存在于样本_节点中。只有在样本中,元素才会随机排列,因为它们是由一个称为gmsh的网格化软件生成的。我实际上正在尝试解析它的输出网格文件。
numpy_索引包具有解决问题关键步骤的功能(在另一个序列中查找一个序列的索引)。如果你不熟悉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安装,没有争议的味道:)
哈哈哈,这似乎总是一个简单的解决办法,不是吗?问题是,你的小费用在我的笔记本电脑上,但我不能让它用在我研究所的电脑上,在那里我没有安装"numpy_indexed"的管理员权限,管理员正在休假,现在是学期休息时间。
啊,是的,那很烦人。这个线程中的答案可能对将来的这类事情有帮助:stackoverflow.com/questions/14179941/…
您可以使用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]])
。
在我的情况下工作得很好……谢谢。。鞠躬……-)