python多个条件组合_python – 组合选择器条件

简而言之,您可以:

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_返回一个数组,下一个示例将返回一个列表):

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

[0, 1, 2, 6, 7]

然而,了解numpy窗帘背后发生的事情也很重要. numpy中有两种常见的索引类型. “正常”索引使用任何排序的切片并返回数组的视图.数据不会被复制. “花式”索引使用任意项目序列(例如列表)并复制数据.

因为可以通过标准切片表示法描述的任何内容都有常规步骤(即开始,结束和步骤间隔),所以您可以创建新数组而无需复制原始数据. (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]])

b和c看起来完全相同.但是,c是一段时间内数据的新副本,b引用原始数据.如果我们更改c,则不会修改a:

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

如果我们改变b,a将被修改:

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非常高效(当您开始在内存中使用非常大的数组时,这非常重要.).但是,如果您不知道发生了什么,您可能会被它灼伤.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值