gpt4 book ai didi

python - 组合选择器条件

转载 作者:太空狗 更新时间:2023-10-30 02:45:16 25 4
gpt4 key购买 nike

我想结合几个条件从数组中选择行/列。

给定一个矩阵A,我知道

A[:, [1,3]] 

给我第二列和第四列。还有,

A[:, :3]

就像一个魅力。但是,我未能结合条件:

A[:, [:3, 6, 7]]

给我一​​个语法错误。我怎样才能让这个选择继续下去?

最佳答案

简而言之,您可以:

A[:, range(3) + [6, 7]]

A[:, np.r_[:3, 6, 7]]

要理解为什么您的第一次尝试没有成功,您需要更多地了解一般的 python 索引以及 numpy 的索引是如何工作的。


首先,切片符号仅在切片内部有效,因此 blah = [:3, 6, 7] 是无效的 python 语法,因为在这种情况下您正在构建一个新列表. (您正在使用 A[:, [:3, 6, 7]] 隐含地执行此操作。第二组括号构成了一个新列表。)Numpy 有一个特殊的(但经常被讨厌)运算符使用切片符号来构造类似于您想要的东西:np.r_。例如:

In [1]: print np.r_[:3, 6, 7]
[0 1 2 6 7]

请注意,通过添加两个列表,我们可以获得或多或少相同的结果(np.r_ 返回一个数组,下一个示例将返回一个 list)一起:

In [2]: print range(3) + [6, 7]
[0, 1, 2, 6, 7]

但是,了解 numpy 幕后发生的事情也很重要。 numpy 中有两种通用的索引类型。 “正常”索引使用任何类型的切片并返回数组的 View 。数据不会被复制。 “花式”索引使用任意序列的项目(例如列表)并复制数据。

因为任何可以用标准切片符号描述的东西都有规则的步骤(即开始、结束和步骤间隔),你可以在不复制原始数据的情况下创建一个新数组。 (Numpy 数组必须在内存中“有规律地跨越”。您可以在不复制数据的情况下引用“每三个项目”,但不能引用“项目 2、5 和 6”,因为后者没有规则模式。)

所有这些可能看起来令人困惑,但这里有一个例子来说明为什么它很重要。让我们制作一个示例数组并以两种不同(但等效)的方式对其进行切片:

In [1]: a = np.arange(18).reshape(3, 6)

In [2]: a
Out[2]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])

In [3]: b = a[:, :3]

In [4]: b
Out[4]:
array([[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14]])

In [5]: c = a[:, [0, 1, 2]]

In [6]: c
Out[6]:
array([[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14]])

bc 看起来一样。但是,ca 中数据的新副本,而 b 引用原始数据。如果我们更改 ca 将不会被修改:

In [7]: c[0, 0] = 10000

In [8]: c
Out[8]:
array([[10000, 1, 2],
[ 6, 7, 8],
[ 12, 13, 14]])

In [9]: a
Out[9]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])

如果我们更改ba 将被修改:

In [10]: a
Out[10]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])

In [11]: b[0,0] = 99999

In [12]: a
Out[12]:
array([[99999, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[ 12, 13, 14, 15, 16, 17]])

In [13]: b
Out[13]:
array([[99999, 1, 2],
[ 6, 7, 8],
[ 12, 13, 14]])

这使您可以对内存使用进行大量控制,并使 numpy 非常高效(当您开始在内存中处理非常大的数组时,这真的很重要。)。但是,如果您不知道发生了什么,您可能会被它烧伤。

关于python - 组合选择器条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25327541/

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