首页 > 解决方案 > NumPy:从二维数组中索引一个元素

问题描述

我有以下 8 x 8 数组命名arr

[[False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]
 [False False False False False False False False]]

我想将它的特定元素设置为True,为此我有这个filtered_ind数组:

[[5 6]
 [4 5]
 [2 5]
 [1 6]]

尝试这样做:

arr[filtered_ind] = True

结果如下:

[[False False False False False False False False]
 [ True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True]
 [False False False False False False False  True]
 [ True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True]
 [False False False False False False False False]]

基本上,它获取filtered_ind数组中的每个数字,并将这些行设置为True,而不是设置特定元素。

我发现索引不像我认为的那样工作,因为print(arr[filtered_ind])给了我这个:

[[[False False False False False False False False]
  [False False False False False False False False]]

 [[False False False False False False False False]
  [False False False False False False False False]]

 [[False False False False False False False False]
  [False False False False False False False False]]

 [[False False False False False False False False]
  [False False False False False False False False]]]

而不是我所期望的,这[False False False False]当然是。

我该如何解决这个问题,更重要的是,为什么会这样?

标签: pythonarraysnumpy

解决方案


您只是沿第一个轴进行索引。你需要:

a = np.full((8,8), False)
ix = np.array([[5, 6],[4, 5],[2, 5],[1, 6]])

a[ix[:,0], ix[:,1]] = True

或者我们也可以np.add.at在这里使用:

np.add.at(a,tuple(zip(*ix)),True)

print(a)
[[False False False False False False False False]
 [False False False False False False  True False]
 [False False False False False  True False False]
 [False False False False False False False False]
 [False False False False False  True False False]
 [False False False False False False  True False]
 [False False False False False False False False]
 [False False False False False False False False]]

请记住,通过按原样编制索引a[ix],您在第一个轴上编制索引。通过一个更简单的示例,您会更清楚地看到:

ix = np.array([[1,2],[0,3],[2,2]])

a = np.arange(0,16).reshape(4,4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

现在,如果你沿着第一个轴索引,就像你做的那样,你会得到:

a[ix]

array([[[ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[ 0,  1,  2,  3],
        [12, 13, 14, 15]],

       [[ 8,  9, 10, 11],
        [ 8,  9, 10, 11]]])

基本上与索引中的值一样多的行,具有索引数组的形状。您还必须指定要索引的列(第二个轴),例如在第一种方法中,[ix[:,0]沿第一个轴和ix[:,1]沿第二个轴:

a[ix[:,0], ix[:,1]] = True

推荐阅读