为了账号安全,请及时绑定邮箱和手机立即绑定

Numpy:在左边的任何东西都是假的地方设置假

Numpy:在左边的任何东西都是假的地方设置假

幕布斯6054654 2021-09-25 14:13:24
如何根据每个值左侧列中的值设置 numpy 数组中的值...?我正在运行一些模拟来预测存活率,但下面是我正在尝试做的核心。我预测了一堆离散的时间点生存,表示为 True 和 Falses。每行是一个模拟,每列是一个时间点(即 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 的右侧。有没有办法在没有两个嵌套循环的情况下做到这一点?我正在寻找更好的方法,但很难知道我是否可以使用内置函数来做到这一点。
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

在完美的工具存在:


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]])


查看完整回答
反对 回复 2021-09-25
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

使用fornumpy 数组时尽量不要使用纯循环。

改用cumulative product反对axis=1

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


查看完整回答
反对 回复 2021-09-25
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-09-25
  • 3 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信