在最小值的索引处返回二进制“1”

Returning binary '1' at index of minimum value

我有一个形状为 (50,2) 的 np 数组

所以对于每一行,我都试图获得我认为我设法获得的最小值的索引 大致

for i in range(len(mylist)):
list(my_list[i]).index(min(my_list[i]))

但是,我对如何在最小值的索引处插入“1”感到困惑?

例如

([[2,4],
 [5,3]])

will give the index values for the  min(my_list) as 
0
1

那么第一行的索引为 0,第二行的索引为 1

如何在最小值的索引处插入二进制值,以便输出类似于

[1,0]
[0,1] 
.
.
.

谢谢!

使用 numpy.arange for the indices of the rows and numpy.argmin 作为列的索引:

import numpy as np

arr = np.array([[2, 4],
                [5, 3]])

res = np.zeros_like(arr)
res[np.arange(arr.shape[0]), arr.argmin(axis=1)] = 1
print(res)

输出

[[1 0]
 [0 1]]

解决问题的一种更优雅、更易读的方法是,首先将数组复制到另一个数组中,然后切换第二个数组中的列,只需简单地使用逻辑运算符即可获得所需内容。看看下面的代码:

import numpy as np

my_list = np.array([[2, 4],
                    [5, 3]])

my_list_swaped = my_list.copy()
my_list_swaped [ : , [0,1]] = my_list_swaped[ : ,[1,0]]  #Swapping the columns

print( my_list < my_list_swaped )

您将得到的是:

array([[ True, False],
       [False,  True]])

基本上是:

array([[ 1, 0],
       [0,  1]])

简化代码:
如果你没有遇到问题肮脏的方式(可读性较差的方式),你可以直接使用逻辑运算符和索引来获得你想要的东西:

import numpy as np

my_list = np.array([[2, 4],
                    [5, 3]])
result = my_list < my_list[ : , [1,0] ]
print(result)

您可以将 argmin 与 identity-matrix-one-hot trick 一起使用:

rng = np.random.default_rng()
exmpl = rng.integers(0,10,(4,2))
exmpl
# array([[4, 0],
#        [8, 5],
#        [1, 3],
#        [3, 0]])

np.identity(2,int)[exmpl.argmin(1)]
# array([[0, 1],
#        [0, 1],
#        [1, 0],
#        [0, 1]])