zoukankan      html  css  js  c++  java
  • 数据分析 numpy数组_02数组广播

    理解:

    1、维度(轴)也就是形状(shape)的长度(len)。维度的长度(轴的长度)(维度)指的是轴上元素的个数。对于二维数组,轴0表示数组的行, 所以轴0的方向从上到下;轴1表示数组的列,所以轴1的方向是从左到右。对于三维数组,轴的编号从外向内,从行到列,所以轴的方向是从外到内,从上到下,从左到右。

    2、数组具有哪些优点?

    实现数组的改变,数组迭代器。通过调用改变数组形状的方法,flat,ravel

    3、广播机制,实现了轴数不同但是轴上元素个数相同的不同形状之间的求和,或者维度相等的数组中有一个轴的长度为1,则可以沿着长度为1的轴广播。

    为什么广播机制不能实现一维数组和三维数组的运算?!!!

      不一样的用1来补齐,在前面补1;维度相等,一种情况:相同的轴的元素个数相等,另一种情况:相同轴的元素个数不等,但是其中一个数组在该轴的元素个数为1,满足这两种情况shape不一样的数组可以通过广播机制实现+、*等运算。输出的元组的shape需要是输入数组形状的各个维度上的最大值!!!!!!

      难点:广播机制在很多地方用到:不同形状数组的运算;数组的操纵,broadcast;broadcast_to!!!;numpy.insert,传递了 Axis 参数。 会广播值数组来配输入数组。

    修改数组维度

    维度描述
    broadcast 产生模仿广播的对象(难点!)
    broadcast_to 将数组广播到新形状(难点!)
    expand_dims 扩展数组的形状,增加一维条目
    squeeze 从数组的形状中删除一维条目

    4、'降维打击'

                   二维数组-轴方向

    三维数组-轴方向

    降维-将轴2看成一体

    轴2的计算-相当于将轴2进行分别求和

     

    import numpy as np
    
    a = np.array([[[1, 2]],
                  [[3, 4]],
                  [[5, 6]]])
    b = np.array([[4, 5]])
    c = a+b
    print(c)
    print(c[0, 0, 0])
    for i in np.nditer(c):
        print(i, end=',')

     为什么a 和 a.T 的遍历顺序是一样的,也就是他们在内存中的存储顺序也是一样的,但是 a.T.copy(order = 'C') 的遍历结果是不同的,那是因为它和前两种的存储方式是不一样的?r

    因为nditer默认order = ‘k’,与数组a的排列尽可能接近的顺序访问元素,而且个人认为a.T也是默认order = ‘K’,所以访问元素顺序是一致的!而copy的默认访问顺序是order = ‘c’!order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'K' -- 元素在内存中的出现顺序!!!!!!

    import numpy as np
    
    a = np.arange(6).reshape(2, 3)
    print(a.T)
    for x in np.nditer(a.T):
        print(x, end=", ")
    print('
    ')
    
    for x in np.nditer(a.T.copy()):
        print(x, end=", ")
    print('
    ')

     两个numpy数组,怎么讲数组a的值和数组b的值调换呢?nditer当中的参数:op_flags =['readwrite'],‘readonly’、‘writeonly’,在解释器里面是怎么实现读写呢?获取数组里面的元素之后怎么将元素放回原来的数组呢?nditer 多维迭代器!普通迭代,n维数组就需要n个for循环!但是nditer 多维迭代器使用一个for循环就可以遍历整个多维数组。

    import numpy as np
    
    a = np.arange(0, 60, 5)
    a = a.reshape(3, 4)
    print('原始数组是:')
    print(a)
    print('
    ')
    for x in np.nditer(a, op_flags=['readwrite']):
        x[...] = 2 * x  # 一脸懵逼,为什么x[...]中的x就可以使用[...]?x为数组,只是是零维数组!!!这个零维数组和二维数组a有什么关系??????
        print(x[...])   print('修改后的数组是:')
    print(a)

    flags参数,nditer类有以下参数,而且flags可以接受以下值

    参数描述
    c_index 可以跟踪 C 顺序的索引
    f_index 可以跟踪 Fortran 顺序的索引
    multi-index 每次迭代可以跟踪一种索引类型
    external_loop 给出的值是具有多个值的一维数组,而不是零维数组

    广播迭代,如果两个数组是可广播的,nditer 组合对象能够同时迭代它们。 假设数组 a 的维度为 3X4,数组 b 的维度为 1X4 ,则使用以下迭代器(数组 b 被广播到 a 的大小

     

     

     

     

  • 相关阅读:
    LFS Linux From Scratch 笔记2(经验非教程)BLFS
    LFS Linux From Scratch 笔记(经验非教程)
    Using VNC on a debian/Ubuntu server with a OS X Mac
    Use weechat (IRC client) on OS X. MacBook Pro
    HC
    Vim 7.4.1952 with Python/Ruby/Lua/Perl/C Syntax built for Ubuntu 16.04 x86_64
    How to make workflow chart using several tools in Linux?
    STM32 串口 重定向
    有哪些大家不说,但需要知道的社会规则?
    如何理解 UL94HB , UL94-V0 , UL94-V1 , UL94-V2
  • 原文地址:https://www.cnblogs.com/yinminbo/p/11428200.html
Copyright © 2011-2022 走看看