问题和我的期望。
我有一个表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
我不知道如何应用此 map 。
我做了什么。
我尝试将h
映射到一个新表generations
,使用上升沿检测来指示H键的代数。得到的世代表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
:
H键的生命周期是同一代所有年龄中的最大年龄。然而,我一直坚持这个映射。
一些代码
我用来计算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
最佳答案
我会做一些更简单的事情,尽管不是最“Pythonic”的解决方案。我会使用以下算法:
取每一列
循环遍历列,直到达到非零条目
记录非零条目的“连续”时间
将此添加到列表
重新循环该列
识别第一个条纹
将第一个条纹中的值更改为上面列表中的第一个条目。
关于python - 如何将状态表映射到numpy中的生命表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62858920/