数据分析 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 的大小