数据分析 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('\n')

for x in np.nditer(a.T.copy()):
    print(x, end=", ")
print('\n')

 两个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('\n')
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 的大小

 

 

 

 

posted @ 2019-12-09 19:12  石斛  阅读(285)  评论(0编辑  收藏  举报