【问题标题】:Returning binary '1' at index of minimum value在最小值的索引处返回二进制“1”
【发布时间】:2021-11-27 10:07:50
【问题描述】:

我有一个形状为 (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] 
.
.
.

谢谢!

【问题讨论】:

标签: python list numpy min


【解决方案1】:

使用numpy.arange 作为行的索引,使用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]]

【讨论】:

  • 谢谢你!有趣的方法 - 我最初正在考虑使用 for 循环,但如果不是更好的话,它也同样有效
【解决方案2】:

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

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)

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      相关资源
      最近更新 更多