python切片多维数组

2024-06-16 10:58:30 发布

您现在位置:Python中文网/ 问答频道 /正文

有谁能解释一下下面的命令(<---)在pythonnumpy中是如何工作的

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

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

Tags: 命令npresizearangereshapepythonnumpy
3条回答

首先,您使用的是NumPy ndarray.reshape,它将给定的数组重新构造为指定的形状。在您的例子中,您将其转换为包含36个元素的一维数组。在

第二,括号内的数字是indexing数组中的某些值。切片为每个维度包含3个值,形式为[number1:number2:number3]。如果您将这些值留空(就像您对数字1和2的情况一样),则会将它们保留为默认值,即number1将为0,number2将为-1(最后一个数组索引),number3将为3:

  • 第一个数字表示数组索引,从中开始获取值。在
  • 第二个数字表示将停止获取值的数组索引。在
  • 最后,最后一个数字表示每次索引读取后将忽略的位置数。在您的例子中,您是每7个索引读取一次。在

有一点需要补充的是,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)

您只需逐个运行命令并分析其输出:

  • 创建第一个[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重塑为1维向量

    >>> tmp = r.reshape(36)
    

    上面的tmp与第一步中的r完全相同

  • 过滤每个元素

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

    切片/索引表示为i:j:k,其中i = fromj = to和{}。因此,5:10:2将意味着从第5元素到第10元素的,每2步给我元素。如果i不存在,则假定它从数组的开头开始。如果j不存在,则假定它一直存在到数组的末尾。如果k不存在,则假定其步长为1(范围内的所有元素)。

有了以上所有内容,您可以在一行中重写示例:

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

或者如果您已经有了r,它是N维的:

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

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

如果您想了解有关切片的更多信息,请参阅numpy documentation。在

相关问题 更多 >