numpy:将false设置为false

时间:2018-12-24 11:11:35

标签: python python-3.x numpy

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的右侧。没有两个嵌套循环,有没有办法做到这一点?我正在寻找一种更好的方法,但努力了解是否可以使用内置函数来做到这一点。

4 个答案:

答案 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)

在处理numpy数组时,请不要使用纯for循环。

使用cumulative product代替axis=1

arr.cumprod(1).astype(np.bool)

答案 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]]