【问题标题】:Return entire array with slice function使用切片函数返回整个数组
【发布时间】:2017-08-29 07:19:36
【问题描述】:

我有一个numpy 数组arr = np.arange(20).reshape(2,10)。我想定义一个切片sli = slice(start,stop, step),然后访问arr[0,sli]。如何定义 sli 使得 arr[0,sli] 是整个数组? IE。 sli=:

我已经试过了:

sli = slice(0,-1) # equivalent to arr[0,:-1]
sli = slice(0,0) # equivalent to []
sli = slice(0) # equivalent to []
sli = slice(0,10) # works fine, but i might not know the shape of arr
                  # at the time I define sli

【问题讨论】:

  • 你试过slice(None)吗?
  • @JonClements 这行得通,谢谢。但是,您是否有理由将其作为评论而不是答案?
  • @cᴏʟᴅsᴘᴇᴇᴅ 我知道很多方法如何访问整个数组,但我想要一种允许使用变量访问整个数组的方法,我的程序依赖于预定义的变量 ant 然后调用 arr[0,sli]
  • @JürgMerlinSpaak 没有足够的咖啡,在移动设备上并且不是 100% 确定 :) 另外 - 某处可能存在欺骗。
  • 呃,我以为你想要arr[0, slice(None)]。如果不是,省略号表示有效:

标签: python arrays python-3.x numpy slice


【解决方案1】:

使用Ellipsis 表示法:

import numpy as np

arr = np.arange(20).reshape(2,10)
sli = ...
out = arr[0, sli]

print(out)    
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

适用于 python3.x。对于旧版本,您应该使用slice(None)

【讨论】:

  • 有趣,为什么使用Ellipisis 有效,为什么要使用它?我记得省略切片的参数会产生与使用 None 相同的 CPython 字节码,所以这似乎是显而易见的 Pythonic 选择?
  • @Chris_Rands 小心使用 None 因为它在某些情况下会增加尺寸。
  • 谢谢,能举个小例子吗?
  • @Chris_Rands 如果你打印arr[0, None],它会增加一个额外的维度。
【解决方案2】:

JonClements 的评论

sli = slice(None)
arr[0,sli]
# array([0,1,2,3,4,5,6,7,8,9])

【讨论】:

  • 这不返回整个数组?只有第一行。这就是你想要的吗?
  • @cᴏʟᴅsᴘᴇᴇᴅ 我想要一个变量sli,s.t. arr[0,sli] 等价于arr[0,:],分别等价于arr[0]。所以这很好用,除非有一些隐藏的地方。
  • sli = ...; arr[0, sli] 工作我的伙计。
  • 省略号大约快 100 纳秒(在大小为 (60000, 50) 的 arr 上测试),这是唯一的差异,因为它是一种语言构造,而不是函数调用。
  • @cᴏʟᴅsᴘᴇᴇᴅ 是的,我知道,这就是我为您的帖子投票的原因。但是,它仅在我只想要一个变量进行索引时才有效(分别是最后一个是省略号)。事实并非如此(我知道,问题中没有提到这一点,对此感到抱歉,当时没有想到这样的问题)。
猜你喜欢
  • 2012-01-09
  • 1970-01-01
  • 2021-10-12
  • 2019-12-16
  • 2017-08-25
  • 1970-01-01
  • 2014-04-22
  • 2013-05-12
  • 2021-10-17
相关资源
最近更新 更多