使用range()或slice()分割二维数组的差异

问题描述 投票:0回答:1

[当我尝试学习slice()的工作原理时,使用range()与slice()时遇到了一些有趣的结果。我不知道如何解释该机制。任何帮助将不胜感激。

例如:给定一个np数组:

a = np.array(range(100)).reshape(10,10)

[a[slice(0,10,2)]a[range(0,10,2)]相同。

但是,

a[(slice(0,10,2),slice(0,10,2))] 

[[0,2...],[20,22...],[40,42,44]...]

但是

a[(range(0,10,2),range(0,10,2))] 

[0,22,44,66...]

任何人都可以解释吗?

python numpy slice numpy-slicing
1个回答
0
投票

通常,用范围索引和使用切片索引是两个非常不同的东西。您偶然遇到了一个给出相等结果的案例,尽管请注意,切片版本会创建基础缓冲区的view,而使用range对象建立索引将创建新的基础缓冲区。

所以请注意:

>>> a = np.array(range(100)).reshape(10,10)
>>> s = a[slice(0,10,2)]
>>> r = a[range(0,10,2)]
>>> a[0,0] = 1000
>>> a
array([[1000,    1,    2,    3,    4,    5,    6,    7,    8,    9],
       [  10,   11,   12,   13,   14,   15,   16,   17,   18,   19],
       [  20,   21,   22,   23,   24,   25,   26,   27,   28,   29],
       [  30,   31,   32,   33,   34,   35,   36,   37,   38,   39],
       [  40,   41,   42,   43,   44,   45,   46,   47,   48,   49],
       [  50,   51,   52,   53,   54,   55,   56,   57,   58,   59],
       [  60,   61,   62,   63,   64,   65,   66,   67,   68,   69],
       [  70,   71,   72,   73,   74,   75,   76,   77,   78,   79],
       [  80,   81,   82,   83,   84,   85,   86,   87,   88,   89],
       [  90,   91,   92,   93,   94,   95,   96,   97,   98,   99]])
>>> s
array([[1000,    1,    2,    3,    4,    5,    6,    7,    8,    9],
       [  20,   21,   22,   23,   24,   25,   26,   27,   28,   29],
       [  40,   41,   42,   43,   44,   45,   46,   47,   48,   49],
       [  60,   61,   62,   63,   64,   65,   66,   67,   68,   69],
       [  80,   81,   82,   83,   84,   85,   86,   87,   88,   89]])
>>> r
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
       [80, 81, 82, 83, 84, 85, 86, 87, 88, 89]])

使用切片时,您将获得切片语义。范围对象被视为索引序列。这会触发advanced indexing behavior

因此来自文档:

当索引包含的整数数组与被索引有维度,索引很简单,但是与切片不同。

所以,ARR[[x1, x2, ..., xn], [y1, y2, ..., yn]]会给您类似

[ARR[x1,y1], ARR[x2,y2], ... ARR[xn, yn]]
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.