gpt4 book ai didi

python - 使用 Numpy 数组、元组和省略号进行 bool 索引

转载 作者:行者123 更新时间:2023-12-01 04:34:10 26 4
gpt4 key购买 nike

我理解 Numpy 数组 bool 索引与整数的概念

In [95]: a=np.array([1, 2, 3, 2, 1, 2])

In [96]: a==1
Out[96]: array([ True, False, False, False, True, False], dtype=bool

In [97]: a[a==1]
Out[97]: array([1, 1])

但我不明白 Numpy 数组和元组的比较如何进行那么为什么

In [106]: a = np.array([(2011, 3), (2011, 3), (2011, 3), ..., (2015, 6), (2015, 6),
(2015, 6), (2011, 3), (2011, 3)], dtype=object)

(...) 是省略号

返回

In [107]: a==(2011,3)
Out[107]: False

我期待一个像这样的数组

array([ True,  True,  True, False, False, False, False,  True,  True], dtype=bool)

如何将带有元组的 Numpy 数组与元组进行比较以获得 bool 值数组?

对于 Pandas 来说这非常简单

In [113]: pd.Series(a)==(2011, 3)
Out[113]:
0 True
1 True
2 True
3 False
4 False
5 False
6 False
7 True
8 True
dtype: bool

但我正在寻找一个纯粹的 Numpy 解决方案。

最佳答案

问题是 a 是 dtype object。许多普通的数组操作都没有为这种类型的数组定义,并且通常它会恢复为将数组视为列表。

In [382]: a==(2011,3)
Out[382]: False
In [383]: a.tolist()==(2011,3)
Out[383]: False

正如 @Alexander 指出的,您可以使用列表理解来执行逐个元素的比较。此版本甚至可以与省略号一起使用:

In [399]: [i==(2011,3) for i in a]
Out[399]: [True, True, True, False, False, False, False, True, True]

省略号未生成标量 bool 值。我可以用元组替换它,并且仍然获得标量。

In [384]: a1=a.copy()
In [385]: a1[3]=(0,0)
...
In [387]: a1==(2011,3)
Out[387]: False

省略号乍一看像是一个打印工件。但事实上,pd.Series(a)==(2011, 3) 恰好生成 9 个值,这表明它可能不是 - 除非 pd 格式化只是巧合仅用 Ellipsis 替换一个元素。

省略号可能是 a 是对象数据类型的原因。

In [389]: np.array([(2011, 3), (2011, 3), (2011, 3), Ellipsis, (2015, 6), (2015, 6),(2015, 6), (2011, 3), (2011, 3)])
Out[389]:
array([(2011, 3), (2011, 3), (2011, 3), Ellipsis, (2015, 6), (2015, 6),
(2015, 6), (2011, 3), (2011, 3)], dtype=object)

没有它np.array会产生一个二维数组:

In [390]: np.array([(2011, 3), (2011, 3), (2011, 3), (2015, 6), (2015, 6),(2015, 6), (2011, 3), (2011, 3)])
Out[390]:
array([[2011, 3],
[2011, 3],
[2011, 3],
[2015, 6],
[2015, 6],
[2015, 6],
[2011, 3],
[2011, 3]])
没有省略号的

a1 可以通过以下方式转换为 2d:

In [396]: a1.astype('i,i').view(int).reshape(-1,2)
Out[396]:
array([[2011, 3],
[2011, 3],
[2011, 3],
[ 0, 0],
[2015, 6],
[2015, 6],
[2015, 6],
[2011, 3],
[2011, 3]])

可以使用 (...).all(axis=1) 测试 2d

关于python - 使用 Numpy 数组、元组和省略号进行 bool 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32005403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com