如何根据每行的条件替换np 2d数组中的值

2024-05-19 20:12:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有概率的numpy 2d数组(名为lda_fit),其中我希望根据每行中的最大值,将概率替换为0或1

array([[0.06478282, 0.80609092, 0.06511851, 0.06400775],
       [0.50386571, 0.02621445, 0.44400621, 0.02591363],
       [0.259538  , 0.04266385, 0.65470484, 0.04309331],
       ...,
       [0.01415491, 0.01527508, 0.22211579, 0.74845422],
       [0.01419367, 0.01537099, 0.01521318, 0.95522216],
       [0.25      , 0.25      , 0.25      , 0.25      ]])

因此,毕竟第一行应该像[0,1,0,0],第二行像[1,0,0,0],依此类推。我已经尝试过了,这是可行的,但只适用于给定的阈值(0.5):

np.where(lda_fit < 0.5,0,1)

但由于最大值可能不大于0.5,因此我希望为每行指定一个新阈值。不幸的是,这给了我整个数组的最大值

np.where(lda_fit < np.max(lda_fit),0,1)

Tags: numpynp阈值数组概率wherearraymax
1条回答
网友
1楼 · 发布于 2024-05-19 20:12:35

可以使用np.max指定轴:

(lda_fit.max(1,keepdims=True)==lda_fit)+0

注意:如果一行中有多个最大值,则所有最大值都将返回1。对于替代解决方案,请遵循下一种方法

输出,例如有问题的输入:

[[0 1 0 0]
 [1 0 0 0]
 [0 0 1 0]
 [0 0 0 1]
 [0 0 0 1]
 [1 1 1 1]]

如果一行中有多个max,如果您只想将第一个max设置为1,将其余max设置为0,则可以使用argmax

(lda_fit.argmax(axis=1)[:,None] == range(lda_fit.shape[1]))+0

或者同等地:

lda_fit_max = np.zeros(lda_fit.shape, dtype=int)
lda_fit_max[np.arange(len(lda_fit)),lda_fit.argmax(axis=1)]=1

输出:

[[0 1 0 0]
 [1 0 0 0]
 [0 0 1 0]
 [0 0 0 1]
 [0 0 0 1]
 [1 0 0 0]]

相关问题 更多 >