3.3 索引的维度变换
对于数组,如果我们不考虑下标数组的情况,也就是:其下标仅仅为整数、或者切片,则有:
- 每次下标中出现一个整数下标,则索引结果的维度降 1。该维度被吸收掉
- 每次下标中出现一个切片下标,则该维度保持不变。
前面提到:多维数组的下标必须是一个长度和数组的维度 ndim 相等的元组
。但是如果下标中包含None
,则可以突破这一限制。每多一个None
,则索引结构维度升 1 。
- 当数组的下标元组的长度小于等于数组的维度
ndim
时,元组中出现的None
等价于切片:
- 当数组的下标元组的长度大于数组的维度
ndim
时,元组中哪里出现None
,索引结果就在哪里创建一个新轴,该轴长度为 1。如c=a[0,:,None]
,索引结果的维度为(3,1)
;而d=a[0,None,:]
的索引结果维度为(1,3)。
4. 操作多维数组
numpy.concatenate((a1, a2, ...), axis=0)
:连接多个数组。其中(a1,a2,...)
为数组的序列,给出了待连接的数组,它们沿着axis
指定的轴连接。
- 所有的这些数组的形状,除了
axis
轴之外都相同。
一轴方向是横向,一个为5元素,一个为4元素,
第二个concatenate ,是纵向方向,横向元素相同,但纵向,一个为2行,一个为3行。
第三个concatenate 因为1轴尺寸不等,所以在0轴方向上不能concatenate
-
numpy.vstack(tup)
:等价于numpy.concatenate((a1, a2, ...), axis=0)
。沿着 0 轴拼接数组- 沿0轴拼接(垂直拼接),增加行
-
numpy.hstack(tup)
:等价于numpy.concatenate((a1, a2, ...), axis=1)
。沿着 1 轴拼接数组- 沿1轴拼接(水平拼接),增加列
-
numpy.column_stack(tup)
:类似于hstack
,但是如果被拼接的数组是一维的,则将其形状修改为二维的(N,1)
。- 沿列方向拼接,增加列
numpy.c_
对象的[]
方法也可以用于按列连接数组。但是如果被拼接的数组是一维的,则将其形状修改为二维的(N,1)。
- 沿列方向拼接,增加列
numpy.split(ary, indices_or_sections, axis=0)
用于沿着指定的轴拆分数组ary
。indices_or_sections
指定了拆分点:
- 如果为整数
N
,则表示平均拆分成N
份。如果不能平均拆分,则报错 - 如果为序列,则该序列指定了划分区间(无需指定最开始的
0
起点和终点)。如[1,3]
指定了区间:[0,1],[1,3],[3:]
- 而
numpy.array_split(ary, indices_or_sections, axis=0)
的作用也是类似。唯一的区别在于:当indices_or_sections
为整数,且无法平均拆分时,并不报错,而是尽可能的维持平均拆分。
numpy.transpose(a, axes=None)
:重置轴序。如果axes=None
,则默认重置为逆序的轴序(如原来的shape=(1,2,3)
,逆序之后为(3,2,1)
)。如果axes!=None
,则要给出重置后的轴序。它获得的是原数组的视图。
numpy.swapaxes(a, axis1, axis2)
:交换指定的两个轴axis1/axis2
。它获得是原数组的视图。
5. 打印数组
-
当打印
ndarray
时,numpy
按照Python的嵌套list
的格式打印输出,但是按照以下顺序打印:如: 一维的
ndarray
按行打印;二维的ndarray
按照矩阵打印;三维的ndarray
按照矩阵的list
打印如果
ndarray
太大,那么numpy
默认跳过中间部分的数据而只是输出四个角落的数据。- 最底层的
axis
按照从左到右的顺序输出 - 次底层的
axis
按照从上到下的顺序输出 - 其他层的
axis
也是按照从上到下的顺序输出,但是每个slice
中间间隔一条空行
- 最底层的
-
要想任何时候都打印全部数据,可以在
print(array)
之前设置选项numpy.set_printoptions(threshold='nan')
。这样后续的打印ndarray
就不会省略中间数据。
6、Nan 和无穷大
-
在
numpy
中,有几个特殊的数:numpy.nan
表示NaN
(Not a Number
),它并不等价于numpy.inf
(无穷大)。numpy.inf
:正无穷numpy.PINF
:正无穷(它就引用的是numpy.inf
)numpy.NINF
:负无穷
-
numpy.isnan(x[,out])
:返回x
是否是个NaN
,其中x
可以是标量,可以是数组。numpy.isfinite(x[, out])
:返回x
是否是个有限大小的数,其中x
可以是标量,可以是数组。numpy.isfinite(np.nan)
返回False
,因为NaN
首先就不是一个数 。numpy.isposinf(x[, out])
:返回x
是否是个正无穷大的数,其中x
可以是标量,可以是数组numpy.isposinf(np.nan)
返回False
,因为NaN
首先就不是一个数numpy.isneginf(x[, out])
:返回x
是否是个负无穷大的数,其中x
可以是标量,可以是数组numpy.isneginf(np.nan)
返回False
,因为NaN
首先就不是一个数numpy.isinf(x[, out])
:返回x
是否是个无穷大的数,其中x
可以是标量,可以是数组numpy.isinf(np.nan)
返回False
,因为NaN
首先就不是一个数。 -
下列函数用于对这几个特殊的数进行转换:
numpy.nan_to_num(x)
:将数组x
中的下列数字替换掉,返回替换掉之后的新数组: 负无穷:替换为一个非常小的数字 。 正无穷:替换为一个非常大的数字 。NaN
:替换为0 。