我有一个表h
,它表示氢键状态,其中1
表示现有氢键,0
表示不存在氢键。列用于不同的对象,行用于不同的时间步长
0, 0, 1, 1, 0, 0
0, 0, 1, 1, 0, 0
1, 0, 1, 1, 0, 0
1, 1, 1, 1, 0, 1
0, 1, 0, 0, 1, 1
0, 1, 0, 0, 1, 1
1, 0, 1, 1, 0, 1
我想计算每个物体的寿命(氢键存在的时间)。所以预期寿命表L
应该是这样的
0, 0, 4, 4, 0, 0
0, 0, 4, 4, 0, 0
2, 0, 4, 4, 0, 0
2, 3, 4, 4, 0, 4
0, 3, 0, 0, 2, 4
0, 3, 0, 0, 2, 4
1, 0, 1, 1, 0, 4
我不知道如何应用这张地图
我尝试将h
映射到一个新表generations
,该表使用上升沿检测来指示氢键的生成。并且生成表G
获得:
[[0 0 1 1 0 0]
[0 0 1 1 0 0]
[1 0 1 1 0 0]
[1 1 1 1 0 1]
[1 1 1 1 1 1]
[1 1 1 1 1 1]
[2 1 2 2 1 1]]
然后我试着把h
映射到一个新的ages
表,表示氢键的年龄。我得到了下表A
[[0 0 1 1 0 0]
[0 0 2 2 0 0]
[1 0 3 3 0 0]
[2 1 4 4 0 1]
[0 2 0 0 1 2]
[0 3 0 0 2 3]
[1 0 1 1 0 4]]
我试图使用以下逻辑将h
映射到生命表L
:
氢键的寿命是同一代人所有年龄中的最大年龄。然而,我一直坚持这个映射
我用来计算G
和A
的一些代码
def getQbGenerations(self, QbStates):
QbGenerations = np.zeros_like(QbStates, dtype=np.int64)
Generation = np.zeros(QbStates.shape[-1])
Generation[QbStates[0] == 1] = 1
QbGenerations[0] = Generation
for i in range(1, QbStates.shape[0]):
# Rising Edge
RiseMask = np.logical_and(QbStates[i-1]==0, QbStates[i]==1)
Generation[RiseMask] += 1
QbGenerations[i] = Generation
return QbGenerations
def getQbAges(self, QbStates):
QbAges = np.zeros_like(QbStates, dtype=np.int64)
Age = np.zeros(QbStates.shape[-1])
Age[QbStates[0] == 1] = 1
QbAges[0] = Age
for i in range(1, QbStates.shape[0]):
BondMask = QbStates[i] == 1
Age[BondMask] += 1
Age[~BondMask] = 0
QbAges[i] = Age
return QbAges
多亏了find_runs.py
另一个答案是:
获得的结果
我会做一些简单得多的事情,尽管不是最“pythonic”的解决方案。我将使用以下算法:
以每一列为例
循环遍历列,直到到达非零条目
记录非零条目的“条纹”持续时间
将此添加到列表中
重新打开该列
识别第一条条纹
将第一条条纹中的值更改为上面列表中的第一个条目
注意,您已经获得了数组
A
,我们可以从A
继续。 如果使用基于沿帧轴的梯度的算法,则我们可以获得期望的数组L
结果是:
相关问题 更多 >
编程相关推荐