2016-12-07 185 views
0

可以在任何一个解释我如何做以下工作命令(<---)在python numpy的蟒蛇切片多demnsional阵列

r = np.arange(36) 
r.resize(6,6) 

r.reshape(36)[::7] # <--- 
+0

这不是切片多维阵列;只有调整大小产生了这样一个数组,重塑再次产生了一个维度。 –

回答

1

你只需要运行的命令逐一分析它们的输出:

  • 创建第一个[0, 35]数字的列表。

    >>> r = np.arange(36) 
    >>> r 
    array([ 0, 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]) 
    
  • 重塑列表就地6 x 6数组:

    >>> r.resize(6,6) # equivalent to r = r.reshape(6,6) 
    >>> r 
    array([[ 0, 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]]) 
    
  • 重塑矢量r到1Dimensional矢量

    >>> tmp = r.reshape(36) 
    

    tmp以上是完全一样的作为r在第一步

  • 过滤7元件

    >>> tmp[::7] 
    array([ 0, 7, 14, 21, 28, 35]) 
    

    切片/索引被表示为i:j:k,其中i = fromj = tok = step和。因此,5:10:2将意味着从元素5到10的,每2步给我元素。如果i不存在,则假定它是从数组开始的。如果j不存在,则假定它是直到数组结束。如果k不存在,则假定其具有1(步骤1中的所有元素)。

与所有上述情况,你可以重写你的例子在一个单一的路线为:

>>> np.arange(36)[::7] 

或者,如果你已经有了r,这是N维:

>>> r.ravel()[::7] 

这里ravel将返回r的1维视图(优选为reshape(36))。

如果您想了解更多关于切片的信息,请参考numpy documentation

1

首先,您使用的是NumPy ndarray.reshape,它将给定的阵列重建为指定的形状。在你的情况下,你将它转换成一个有36个元素的1维数组。其次,使用括号之间的数字,您的数组中的某些值为indexing。切片由每个维度3个值组成,形式为[number1:number2:number3]。如果您将这些值保留为空(例如您的情况为数字1和2),您将保留它们为默认值,即number1将为0,number2将为-1(最后一个数组索引),number3将为3:

  • 第一个数字表示您将开始采用值的数组索引。
  • 第二个数字表示您将停止取值的数组索引。
  • 最后,最后一个数字表示每次读取索引后将被忽略的位置数。就你而言,你每读7个索引。
0

有一点需要补充,既reshape()resize()方法具有相同的功能,它们之间唯一的区别是它们如何影响到调用数组对象r

  • r.resize()没有返回。它直接改变调用数组对象r的形状。
  • r.reshape()返回一个新的重新整形的数组对象。并保持原来的r不变。

>>> import numpy as np 
>>> r = np.arange(36) 
>>> r.shape 
(36,) 
>>> # 1. --- `reshape()` returns a new object and keep the `r` --- 
>>> new = r.reshape(6,6) 
>>> new.shape 
(6, 6) 
>>> 
>>> # 2. --- resize changes `r` directly and returns `None` --- 
>>> nothing = r.resize(6,6) 
>>> type(nothing) 
<class 'NoneType'> 
>>> r.shape 
(6, 6)