1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
      <output id="hzk7v"></output>
    2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
    3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

      NumPy 基本切片和索引的具体使用方法

       更新时间2019年04月24日 09:13:45   作者Yujiaao   我要评论

      这篇文章主要介绍了NumPy 基本切片和索引的具体使用方法文中通过示例代码介绍的非常详细对大家的学习或者工作具有一定的参考学习价值需要的朋友们下面随着小编来一起学习学习吧

      索引和切片是NumPy中最重要最常用的操作熟练使用NumPy切片操作是数据处理和机器学习的前提所以一定要掌握好

      文档索引

      ndarrays可以使用标准Python x[obj]语法对其进行索引 其中x是数组obj是选择方式有三种可用的索引字段访问基本切片高级索引究竟是哪一个取决于obj

      注意
      在Python中x[(exp1, exp2, ..., expN)]相当于 x[exp1, exp2, ..., expN]; 后者只是前者的语法糖

      基本切片和索引

      基本切片将 Python 的切片基本概念扩展到 N 维当obj是一个slice对象由括号内的start:stop:step符号构造整数或切片对象和整数的元组时会发生基本切片也包括省略号三个点和newaxis对象

      从版本1.15.0开始不推荐使用为了保持向后兼容Numeric中的常见用法如果选择对象是包含 slice 对象省略号或 newaxis 对象的任何非 nararray 和非元组序列例如 list则也会启动基本切片但不适用于整数数组或其他嵌入序?#23567;?/p>

      使用 N 个整数进行索引的最简单情况返回表示相应项的数组标量正如在 Python 中所有下标是从零开始对我个索引你取值?#27573;?#20026;

      0ni<di

      其中d_i是 我的阵列的形状的个元素负指数被解释为从数组的末尾开始计数即如果 n_i <0则意味着n_i + d_i

      基本切片生成的所有数组始终 是原始数组的视图

      序列切片的标准规则适用于基于每维的基本切片包括使用步骤索引要记住的一些有用的概念包括

      基本切片语法是i:j:k其中我是起始索引 j是停止索引并且ķ是步骤

      k0

      这将选择米元件在对应的尺寸与索引值我i,i+k...1 +m - 1k, 其中

      m=q+r neq0

      和 q 和 r 是通过j-i 除 k 所获得的商和余数:

      j−i=qk+r

      因此

      i+m−1k<j

      >>>
      >>> x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
      >>> x[1:7:2]
      array([1, 3, 5])
      

      负i和j被解释为n + i和n + j其中 n是相应维度中的元素数量负k使得踩踏指向更小的指数

      >>>
      >>> x[-2:10]
      array([8, 9])
      >>> x[-3:3:-1]
      array([7, 6, 5, 4])
      

      假设n是要切片的维度中的元素数然后如果我没有给出其默认值为0 K> 0和 N - 1为ķ<0 如果没有给出j则对于k> 0 默认为n ; 对于k <0默认为-n-1如果没有给出k则默认为1.注意 与此相同表示沿此轴选择所有索引:::

      >>>
      >>> x[5:]
      array([5, 6, 7, 8, 9])
      

      如果选择元组中的对象数小于 N则:假定任何后续维

      >>>
      >>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
      >>> x.shape
      (2, 3, 1)
      >>> x[1:2]
      array([[[4],[5],[6]]])
      

      Ellipsis扩展为:制作与长度相同的选择元组所需的对象数x.ndim可能只存在一个省略号

      >>>
      >>> x[...,0]
      array([[1, 2, 3],
          [4, 5, 6]])
      

      newaxis选择元组中的每个对象用于将所得选择的维度扩展一个单位长度维?#21462;?#28155;加的维度是newaxis 对象在选择元组中的位置

      >>>
      >>> x[:,np.newaxis,:,:].shape
      (2, 1, 3, 1)

      整数i返回相同的值i:i+1 除了返回的对象的维度减少1.特别是具有第p个元素的整数和所有其他条目:的选择元组返回具有维度的相应子数组N - 1如果N = 1 则返回的对象是数组标量Scalars中解释了这些对象

      如果选择元组具有:除作为切片对象的第p个条目之外的 所有条目i:j:k则返回的数组具有通过连接由元素ii + k...i +的整数索引返回的子数组形成的维N. m - 1k <j

      :切片元组中具有多个非条目的基本切片就像使用单个非:条目重?#20174;?#29992;切片一样其中:连续地获取非条目所有其他非:条目被替换:因此 在基本切片下的x[ind1,...,ind2,:]行为xind1

      警告

      对于高级索引上述情况并非如此

      您可以使用切片来设置数组中的值但是与列表不同您永远不会增长数组要设置的值的大小 必须可广播为与其相同的形状 x[obj] = valuex[obj]

      注意

      请记住切片元组总是可以构造为obj 并在x[obj]符号中使用可以在构造中使用切片对象来代替[start:stop:step] 符号例如x[1:10:5,::-1]也可以实现为这对于构造适用于?#25105;?#32500;数组的通用代码非常有用obj = (slice(1,10,5), slice(None,None,-1)); x[obj]

      numpy.newaxis
      该newaxis对象可用于所有切片操作?#28304;?#24314;长度为1的轴newaxis是'None'的别名'None'可以用来代替相同的结果

      高级索引

      当选择对象obj是非元组序列对象ndarray数据类型为整数或bool或具有至少一个序列对象或ndarray数据类型为integer或bool的元组时将触发高级索引高级索引有两种类?#20572;?#25972;数和?#32423;?#20540;

      高级索引始终返回数据的副本与返回视图的基本切片形成对比

      警告

      高级索引的定义意味着x[(1,2,3),]根本不同于x[(1,2,3)]后者相当于x[1,2,3]触发基本选择而前者将触发高级索引一定要明白为什么会这样

      同时认识到x[[1,2,3]]将触发高级索引而由于上面提到的不推荐的数字兼容性 x[[1,2,slice(None)]]将触发基本切片

      整数数组索引

      整数数组索引允许根据数组的N维索引选择数组中的?#25105;?#39033;每个整数数组表示该维度的许多索引

      纯整数数组索引

      当索引包含尽可能多的整数数组时索引的数组具有维度索引是直接的但与切片不同

      高级索引始终作为一个广播和迭代

      result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M],
                    ..., ind_N[i_1, ..., i_M]]

      请注意结果形?#20174;?#24191;播索引数组形状相同ind_1, ..., ind_N


      ?#29992;?#19968;行开始应选择一个特定元素行索引是just 列索引指定要为相应行选择的元素将两者结合使用可以使用高级索引解决任务0, 1, 2

      >>>
      >>> x = np.array([[1, 2], [3, 4], [5, 6]])
      >>> x[[0, 1, 2], [0, 1, 0]]
      array([1, 4, 5])
      

      为了实现类似于上面的基本切片的行为可以使用广播该功能ix_可以帮助这种广播通过示例可以最好地理解这一点


      从4x3阵列中应使用高级索引选择角元素因此列是其中之一的所有元素和行?#20999;?#35201;选择的?#23567;?#35201;使用高级索引需要明确选择所有元素使用前面解释的方法可以写0, 2

      >>>
      >>> x = array([[ 0, 1, 2],
      ...      [ 3, 4, 5],
      ...      [ 6, 7, 8],
      ...      [ 9, 10, 11]])
      >>> rows = np.array([[0, 0],
      ...         [3, 3]], dtype=np.intp)
      >>> columns = np.array([[0, 2],
      ...           [0, 2]], dtype=np.intp)
      >>> x[rows, columns]
      array([[ 0, 2],
          [ 9, 11]])
      

      但是由于上面的索引数组只是重复自身因此可以使用广播比?#29616;?#22914;此类的操作 来简化rows[:, np.newaxis] + columns

      >>>
      >>> rows = np.array([0, 3], dtype=np.intp)
      >>> columns = np.array([0, 2], dtype=np.intp)
      >>> rows[:, np.newaxis]
      array([[0],
          [3]])
      >>> x[rows[:, np.newaxis], columns]
      array([[ 0, 2],
          [ 9, 11]])
      

      这种广播也可以使用以下功能实现ix_

      >>>
      >>> x[np.ix_(rows, columns)]
      array([[ 0, 2],
          [ 9, 11]])
      

      请注意如果没有np.ix_调用只会选择对角线元素如上例所示对于使用多个高级索引进行索引这个差异是最重要的

      结?#32454;?#32423;索引和基本索引

      当至少有一个slice:省略号...或newaxis 索引或者数组的维度多于高级索引时行为可能会更复杂这就像连?#29992;?#20010;高级索引元素的索引结果一样

      在最简单的情况下只有一个单一的指标先进单个高级索引可以例如替换切片并且结果数组将是相同的但是它是副本并且可以具有不同的存储器布局当可能时切片是优选的

      >>>
      >>> x[1:2, 1:3]
      array([[4, 5]])
      >>> x[1:2, [1, 2]]
      array([[4, 5]])
      

      了解情况的最简单方法可能是考虑结果形?#30784;?#32034;引操作分为两部分即由基本索引不包括整数定义的子空间和来自高级索引部分的子空间需要区?#33267;?#31181;索引组合

      高级索引由切片?#25351;Ellipsis或newaxis例如x[arr1, :, arr2]

      高级索引彼此相邻例如但不是 因为在这方面是一个高级索引x[..., arr1, arr2, :] x[arr1, :, 1]1

      在第一种情况下高级索引操作产生的维度首先出现在结果数组中然后是子空间维?#21462;?#22312;第二种情况下高级索引操作的维度将插入到结果数组中与初始数组中相同的位置后一种逻辑使简单的高级索引行为就像切片一样


      假设x.shape为10,20,30并且ind是2,3,4形索引intp数组则其形状为10,2,3,4,30因为20形子空间已被替换具有2,3,4形的广播索引子空间如果我们让ijk循环遍及2,3,4形子空间 此示例产生的结果与result = x[...,ind,:]result[...,i,j,k,:] = x[...,ind[i,j,k],:]x.take(ind, axis=-2)


      设x.shape10,20,30,40,50并假设ind_1 并ind_2可以广播到形状2,3,4然后 x[:,ind_1,ind_2]具有形状10,2,3,4,40,50因为来自X的20,30形子空间已经被索引的2,3,4子空间替换但是它 x[:,ind_1,:,ind_2]具有形状2,3,4,10,30,50因为在索引子空间中没有明确的位置所?#36816;?#22312;开头就被添加了始终可以使用 .transpose()在任何需要的位置移动子空间请注意此示例无法使用复制take

      ?#32423;?#25968;组索引

      当obj是?#32423;?#31867;型的数组对象时会发生此高级索引例如可能从比较运算符返回x[obj.nonzero()]如上所述单个?#32423;?#32034;引数组?#23548;?#19978;与obj.nonzero()返回obj.ndim显示objTrue元素的整数索引数组的元组长度相同但是它更快obj.shape == x.shape

      如果返回一个1维数组该数组填充了与obj 值对应的x元素搜索顺序为行主C风格如果物镜具有在该外侧是的边界的条目值X则索引错误将被提高如果obj小于x则与填充它相同obj.ndim == x.ndimx[obj]TrueTrueFalse


      一个常见的用例是过滤所需的元素值例如可能希望从阵列中选择非NaN的所有条目

      >>>
      >>> x = np.array([[1., 2.], [np.nan, 3.], [np.nan, np.nan]])
      >>> x[~np.isnan(x)]
      array([ 1., 2., 3.])
      

      或者希望为所有负面元素添加常量

      >>>
      >>> x = np.array([1., -1., -2., 3])
      >>> x[x < 0] += 20
      >>> x
      array([ 1., 19., 18.,  3.])
      

      通常如果索引包括?#32423;?#25968;组则结果将与插入obj.nonzero()相同位置并使用上述整数数组索引机制相同 相当于 x[ind_1, boolean_array, ind_2]x[(ind_1,) + boolean_array.nonzero() + (ind_2,)]

      如果只有一个?#32423;?#25968;组且没有整数索引数组则这是直截了当的必须注意确保?#32423;?#32034;引具有与其应该使用的维度完全相同的维?#21462;?/p>


      从数组中选择总和小于或等于2的所有行

      >>>
      >>> x = np.array([[0, 1], [1, 1], [2, 2]])
      >>> rowsum = x.sum(-1)
      >>> x[rowsum <= 2, :]
      array([[0, 1],
          [1, 1]])
      

      但如果rowsum还有两个维度

      >>>
      >>> rowsum = x.sum(-1, keepdims=True)
      >>> rowsum.shape
      (3, 1)
      >>> x[rowsum <= 2, :]  # fails
      IndexError: too many indices
      >>> x[rowsum <= 2]
      array([0, 1])
      

      由于额外的维度最后一个只给出了第一个元素比较rowsum.nonzero()以了解此示例

      通过obj.nonzero()类比可以最好地理解组合多个?#32423;?#32034;引数组或?#32423;?#19982;整数索引数组 该函数ix_ 还支持?#32423;?#25968;组并且可以毫无意外地工作


      使用?#32423;?#32034;引选择加起来为偶数的所有?#23567;?#21516;时应使用高级整数索引选择列0和2使用该ix_功能可以通过以下方式完成

      >>>
      >>> x = array([[ 0, 1, 2],
      ...      [ 3, 4, 5],
      ...      [ 6, 7, 8],
      ...      [ 9, 10, 11]])
      >>> rows = (x.sum(-1) % 2) == 0
      >>> rows
      array([False, True, False, True])
      >>> columns = [0, 2]
      >>> x[np.ix_(rows, columns)]
      array([[ 3, 5],
          [ 9, 11]])
      

      没有np.ix_呼叫或只选择对角线元素

      或者没有np.ix_比较整数数组示例

      >>>
      >>> rows = rows.nonzero()[0]
      >>> x[rows[:, np.newaxis], columns]
      array([[ 3, 5],
          [ 9, 11]])
      

      详细?#24471;?/strong>

      这些是一些详细的注释对于日常索引无特定顺序并不重要

      本机NumPy索引类型intp可能与默认的整数数组类型不同intp是足以安全索引任何数组的最小数据类型; 对于高级索引它可能比其他类型更快

      对于高级分配通常不保证迭代顺序这意味着如果元素设置不止一次则无法预测最终结果

      空元组索引是零维数组的完整标量索引 如果是零维则x[()]返回标量否则返回x视图另一方面x[...]总是返回一个视图

      如果索引中存在零维数组并且它是完整的整数索引则结果将是标量而不是零维数组不会触发高级索引
      当存在省略号...但没有大小即替换为零 :时结果仍将始终为数组如果没有高级索引则为视图否则为副本

      nonzero?#32423;?#25968;组的等价性不适用于零维?#32423;?#25968;组

      ?#22791;?#32423;索引操作的结果没有元素但单个索引超出?#27573;?#26102;是否IndexError引发了未定义例如超出?#27573;x[[], [123]]123

      当在赋值期间发生转换错误时例如使用字符串序列更新数值数组被分配的数组可能最终处于不可预测的部分更新状态但是如果发生任何其他错误例如超出?#27573;?#32034;引则阵列将保持不变

      高级索引结果的内存布?#32456;?#23545;每个索引操作进行了优化并?#20063;?#33021;假设特定的内存顺序

      当使用一个子类尤其是其操纵它的形状默认ndarray.__setitem__行为会调用__getitem__的 基本索引而不是先进的索引对于这样的子类最好ndarray.__setitem__使用基类 ndarray视图调用数据如果子类不返回视图则必须执行此操作__getitem__

      现场访问

      也可以?#32431;?br />

      数据类型对象dtype标量

      如果ndarray对象是结构化数组 则可以通过使用字符串索引数组来访问数组的字段类似于?#20540;?/p>

      索引x['field-name']返回数组的新视图该视图与x具有相同的形状当字段是子数组时除外但是数据类型x.dtype['field-name']并且仅包含指定字段中的部分数据还 记录阵列标量可以被索引这种方式

      索引到结构化数组也可以使用字段名称列表来完成 例如 x[['field-name1','field-name2']]从NumPy 1.16开始这将返回仅包含这些字段的视图在旧版本的numpy中它返回了一个副本有关多字段索引的详细信息请参阅结构化阵列的用户指南部分

      如果访问的字段是子数组则子数组的尺寸将附加到结果的形?#30784;?/p>

      >>>
      >>> x = np.zeros((2,2), dtype=[('a', np.int32), ('b', np.float64, (3,3))])
      >>> x['a'].shape
      (2, 2)
      >>> x['a'].dtype
      dtype('int32')
      >>> x['b'].shape
      (2, 2, 3, 3)
      >>> x['b'].dtype
      dtype('float64')
      

      Flat Iterator索引

      x.flat返回一个迭代器它将遍历整个数组以C-contiguous样式最后一个索引变化最快只要选择对象不是元组也可以使用基本切片或高级索引对此迭代器对象建立索引这应该从x.flat一维视图的事实中清楚它可以用于具有1维C风格平面索引的整数索引因此任何返回数组的形状都是整数索引对象的形?#30784;?br />

      以上就是本文的全部内容希望对大家的学习有所帮助也希望大家多多支持脚本之家

      相关文章

      • PyQt5每天必学之?#25103;?#20107;件

        PyQt5每天必学之?#25103;?#20107;件

        这篇文章主要为大家详细介绍了PyQt5每天必学之?#25103;?#20107;件的相关资?#24076;?#20855;有一定的参考价值?#34892;?#36259;的小伙伴们可以参?#23478;?#19979;
        2018-04-04
      • 基于Django的python验证码(实例讲解)

        基于Django的python验证码(实例讲解)

        下面小编就为大家带来一篇基于Django的python验证码(实例讲解)小编觉得挺不错的现在就分享给大家也给大家做个参考一起跟随小编过来?#32431;?#21543;
        2017-10-10
      • python 3.6.4 安装配置方法图文教程

        python 3.6.4 安装配置方法图文教程

        这篇文章主要为大家详细介绍了python 3.6.4 安装配置方法图文教程具有一定的参考价值?#34892;?#36259;的小伙伴们可以参?#23478;?#19979;
        2018-09-09
      • 在Django框架中设置语言偏好的教程

        在Django框架中设置语言偏好的教程

        这篇文章主要介绍了在Django框架中设置语言偏好的教程,Django是最具?#20284;?#30340;Python框架,需要的朋友可以参考下
        2015-07-07
      • Python实现句子翻译功能

        Python实现句子翻译功能

        这篇文章主要介绍了Python实现句子翻译功能涉及urllib库的使用等相关内容具有一定参考价值需要的朋友可以了解下
        2017-11-11
      • 在Lighttpd服务器中运行Django应用的方法

        在Lighttpd服务器中运行Django应用的方法

        这篇文章主要介绍了在Lighttpd服务器中运行Django应用的方法,本文所采用的是最流行的FastCGI模块,包括同时运行多个Django应用的方法,需要的朋友可以参考下
        2015-07-07
      • 解决Python下json.loads()中文字符出错的问题

        解决Python下json.loads()中文字符出错的问题

        今天小编就为大家分享一篇解决Python下json.loads()中文字符出错的问题具有很好的参考价值希望对大家有所帮助一起跟随小编过来?#32431;?#21543;
        2018-12-12
      • 解决python Markdown模块乱码的问题

        解决python Markdown模块乱码的问题

        今天小编就为大家分享一篇解决python Markdown模块乱码的问题具有很好的参考价值希望对大家有所帮助一起跟随小编过来?#32431;?#21543;
        2019-02-02
      • python计算两个数的百分比方法

        python计算两个数的百分比方法

        今天小编就为大家分享一篇python计算两个数的百分比方法具有很好的参考价值希望对大家有所帮助一起跟随小编过来?#32431;?#21543;
        2018-06-06
      • python微元法计算函数曲线长度的方法

        python微元法计算函数曲线长度的方法

        今天小编就为大家分享一篇python微元法计算函数曲线长度的方法具有很好的参考价值希望对大家有所帮助一起跟随小编过来?#32431;?#21543;
        2018-11-11

      最新评论

      3dԻв

        1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
          <output id="hzk7v"></output>
        2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
        3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

            1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
              <output id="hzk7v"></output>
            2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
            3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>