numpy Python:单冒号与双冒号

cedebl8k  于 2023-01-20  发布在  Python
关注(0)|答案(5)|浏览(130)

在这种情况下,单冒号和双冒号有什么区别?data[0:,4] vs data[0::,4]

women_only_stats = data[0::,4] == "female" 

men_only_stats = data[0::,4] != "female"

我试着用data[0:,4]替换data[0::,4],我看不出有什么区别。在这种情况下或其他情况下有什么区别吗?
data是二维数组,行类似于['1' '0' '3' 'Braund, Mr. Owen Harris' 'male' '22' '1' '0' 'A/5 21171' '7.25' '' 'S']

dauxcl2d

dauxcl2d1#

    • 不**,没有区别。

请参见切片的Python文档:
来自文档:a[start:stop:step]
start和step参数默认为None。Slice对象具有只读数据属性start、stop和step,这些属性仅返回参数值(或其默认值)。
在本例中,您将包含一个空的step参数。

>>> a = [1,2,3,4]
>>> a[2:]
[3,4]
>>> a[2::]
[3,4]
>>> a[2:] == a[2::]
True

为了理解step参数的实际作用:

>>> b = [1,2,3,4,5,6,7,8,9,10]
>>> b[0::5]
[1, 6]
>>> b[1::5]
[2, 7]

因此,通过将其隐式地保留为None(即,a[2:]a[2::]),您将不会以任何方式更改代码的输出。
希望这个有用。

fsi0uk1n

fsi0uk1n2#

这两种语法产生相同的索引。

class Foo(object):
  def __getitem__(self, idx):
    print(idx)

Foo()[1::,6]
# prints (slice(1, None, None), 6)
Foo()[1:,6]
# prints (slice(1, None, None), 6)

基本上,1::,6是一个切片(1::)和一个数字(6)的元组。切片的格式为start:stop[:stride]。将跨距留空(1::)或不声明跨距(1:)是等效的。

myzjeezk

myzjeezk3#

没有区别,你用的是相同的slice对象。

ffscu2ro

ffscu2ro4#

事情是这样的:s[start:end:step]。以步长 step 从开始到结束对s进行切片。

f45qwnt8

f45qwnt85#

在您的情况下,数据为

data = ['1' '0' '3' 'Braund, Mr. Owen Harris' 'male' '22' '1' '0' 'A/5 21171' '7.25' '' 'S']

所以它等于

data = ['103Br.............7.25S']

在这种情况下,列表中只有一个项目,因此数据[0::4]或数据[0:4]不会影响任何东西。
如果您尝试此操作,将清除您的问题/答案

print data[0][0::4]
print data[0][0:4]

它就像

data[start:end:step]

因此,如果步长小于数据长度,它的行为与往常一样。

相关问题