numpy np.take与布尔数组的行为

bq9c1y66  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(118)

np.take是一个函数,它沿沿着轴从数组中取出元素。当有一个轴参数指定它的行为完全像“花式”索引(索引使用数组),但没有轴参数的数组a是扁平的,然后从这个数组的索引。然而,文档中没有给出任何关于boolean索引的内容,也没有说明布尔数组的行为:https://numpy.org/doc/stable/reference/generated/numpy.take.html
代码如下:
输入:

a = np.array([2, 3])
b = np.array([[False,  True],
              [ True, False],
              [False,  True],
              [ True, False]])

a.take(b)

输出量:

array([[2, 3],
       [3, 2],
       [2, 3],
       [3, 2]])

在这个特定的代码中,当我们有一个[True,False]列并与[False,True]列保持相同时,输出是如何切换的?现在,当我尝试使用boolean索引时,我将索引作为boolean数组,我得到一个错误:
输入:

a = np.array([2, 3])
b = np.array([[False,  True],
              [ True, False],
              [False,  True],
              [ True, False]])

a[b]

输出量:

IndexError                                Traceback (most recent call last)
<ipython-input-6-8b64b196a893> in <cell line: 7>()
      5               [ True, False]])
      6 
----> 7 a[b]

IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

这个错误对我来说是有意义的,因为索引数组(b)有两个维度,而数组a只有一个维度。那么np.take在做什么呢,它只是切换每行中的列?

hgqdbh6s

hgqdbh6s1#

在文档中,提到“如果索引不是一维的,输出也有这些维度",因此输出将以索引的形式出现。
数组“B”中的True和False分别充当1和0,即索引1和0。所以如果我用这个值替换它,我会得到同样的输出。

import numpy as np
a = np.array([2, 3])
#b = np.array([[False,  True],
#              [ True, False],
#              [False,  True],
#              [ True, False]])
b = np.array([[0,  1],
              [ 1, 0],
              [0,  1],
              [ 1, 0]])              

c = a.take(b)
print(c)

输出

[[2 3]
 [3 2]
 [2 3]
 [3 2]]

如果在数组B中添加一个值,比如“3”,将得到“IndexError:索引3超出大小为2 '的轴0的界限。因为a的大小是2。

import numpy as np
a = np.array([2, 3])
b = np.array([[True,  True],
              [ False, 3]])              

c = a.take(b)
print(c)

输出

c = a.take(b)
IndexError: index 3 is out of bounds for axis 0 with size 2

相关问题