TLDR;如何设置numpy数组中的值,具体取决于每个值左侧的列中的值...?
我正在运行一些模拟,可以预测存活率,但是下面是我要尝试的核心。我预测了一系列离散的时间生存,分别表示为真和假。每行是一个模拟,每列是一个时间点(即col 0是第一个时间点,col 1在其后)
mc = (8, 4)
survival = np.random.random(mc) > np.random.random(mc)
survival
这将给我这样的输出。
array([[False, True, True, False],
[True, False, True, False],
[ True, True, True, True], ...
但是,如果某些东西在第一时间死亡,那就永远死了。所以我的输出需要是:
array([[False, False, False, False],
[True, False, False, False],
[ True, True, True, True], ...
因此,我想将所有False设置为找到的第一个False的右侧。没有两个嵌套循环,有没有办法做到这一点?我正在寻找一种更好的方法,但努力了解是否可以使用内置函数来做到这一点。
答案 0 :(得分:6)
perfect tool存在:
np.logical_and.accumulate(survival,axis=1)
示例:
array([[False, True, False, True],
[ True, True, False, True],
[False, True, True, True],
[False, True, False, False],
[ True, False, False, False],
[False, True, True, True],
[False, False, True, False],
[False, False, True, True]])
=>
array([[False, False, False, False],
[ True, True, False, False],
[False, False, False, False],
[False, False, False, False],
[ True, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False]])
答案 1 :(得分:4)
答案 2 :(得分:1)
通过使用np.argwhere
:
import numpy as np
bob = np.array([[True,True,False,True,True],[True,True,False,True,True],[False,True,True,True,True],[True,True,False,True,True],[False,True,True,True,True]])
for arr in np.argwhere(bob == False):
bob[arr[0],arr[1]:] = False
上面的argwhere
为每个row,column
的false实例返回,我使用这些值将其余行设置为false(在每个false之后)。
答案 3 :(得分:1)
>>> mc = (8, 4)
>>> survival = np.random.random(mc) > np.random.random(mc)
>>> survival
array([[ True, True, True, True],
[ True, False, False, True],
[ True, False, True, True],
[ True, False, True, False],
[False, True, False, False],
[ True, True, False, True],
[ True, True, False, False],
[False, False, True, True]])
和
>>> death = [x.tolist().index(False) if False in x else -1 for x in survival]
>>> [s[ : d].tolist() + [False] * (survival.shape[1] - d) if d != -1 else s.tolist() for s, d in zip(survival, death)]
[[True, True, True, True],
[True, False, False, False],
[True, False, False, False],
[True, False, False, False],
[False, False, False, False],
[True, True, False, False],
[True, True, False, False],
[False, False, False, False]]