numpy(3)——numpy数组性质:属性、索引、切片、变形、拼接、分裂
一、numpy数组的属性NumPy的数组类称作ndarray,通常称作数组。注意numpy.array和标准Python库类中的array.array并不相同,后者只处理一维数组和提供少量的功能。 ndarray是一个通用的同构数据多维容器。同构的意思就是所有元素是相同类型的。 本文中“数组”、“Numpy数组”、“ndarray”,基本都是指同一个东西,即ndarray对象。
1. 数组的维度 x.ndim #数组的维度。二维数组为2,三维数组为3,以此类推。【例1】【例2】
2. 数组的形状 x.shape #数组的形状。返回一个表示各维度大小的元组。【例2】
3. 数组的元素类型
x.dtype //数组中元素的类型。【例3】
4. 数组的元素个数 x.size //数组元素个数。【例4】
例1:
例2:
例3:返回数组中元素的类型。
例4:
二、数组的索引2.1 一维数组索引跟Python的序列索引一样。比如 x = np.arange(10), x[0]为0,x[-1]为9。
#假设a=[0,1,2,3,4,5,6,7,8,9] a[5] #5。 a[-1] #9。 a[1]=5 #将a的元素进行改变。a变为[0 5 2 3 4 5 6 7 8 9]。 a[1]=5.2 #将a的元素进行改变。a变为[0 5 2 3 4 5 6 7 8 9]。因为数组的类型是固定的,所以会进行转换。【例1】
2.2 多维数组索引假设a=[[1,2,3,4], [5,6,7,8]]
a[1] #[5 6 7 8]。在二维数组中,各索引位置上的元素不再是标量而是一维数组。 a[1][2] 或 a[1,2] #a[1]为[5,6,7,8],a[1][2]为7。这种方法是对元素进行递归访问。 但是递归方法比较麻烦,可以传入一个以逗号隔开的索引列表来选取单个元素。
例1: 结果:
三、数组的切片3.1 一维数组的切片一维数组的切片,与列表是一样的。
#假设a=[0,1,2,3,4,5,6,7,8,9]。 a[5:8] #[5,6,7]。 a[::-1] #[9 8 7 6 5 4 3 2 1 0]
3.2 多维数组的切片#假设a=[[1,2,3,4], [5,6,7,8]]
a[:2, 1:] #“:2”表示第一个轴从头到2,为前两行。“1:”表示从第2列到最后。所以返回2*3的二维数组。 a[:2, 0:3:2] #前两行,前3列(每隔一列)。 a[:, :;-1] #列倒过来。 a[::-1, ::-1] #行和列都倒过来。
a[:1] #第一行。第一个轴从头到1(不含1),所以是第0行。返回1*4的二维数组。 a[:,0] #取第1列。第一个轴取所有,第二个轴取0。所以为第1列。返回的是一维的数组。 a[:, :1] #取第1列。虽然与a[:,0]都是取第一列。但是结果的维度不一样。此处还是二维数组。 a[:] #a的所有元素。 a[:2, ]
获取数组的行和列: a[1, :] #获取第一行 a[:, ]
a[5:8]=12 #将a的元素进行改变。a变为[ 0 1 2 3 4 12 12 12 8 9]。【例3】 #当将一个标量赋值给一个切片时,该值会自动传播(也就是附录中会讲到的“广播”)到整个选区。 #这种写法在python list中会报错。 a[:] =12 #将a的所有元素进行改变。【例4】。不能直接写为a=12。如果这样写,就相当于给a赋值12了。 b=a[5:8] #b=[5,6,7]。注意:如果再修改b的值,a的值也会改变。这是因为,数组切片是原始数组的视图。【例5】 #由于NumPy的设计目的是处理大数据,所以你可以想象一下,假如NumPy坚持要将数据复制来复制去的 话会产生何等的性能和内存问题。所以这样设计。这个地方跟python的切片不同。 b=a[5:8].copy() #如果想要得到的是ndarray切片的一份副本而非视图,就需要明确地进行复制操作。【例6】
#假设a=[[1,2,3,4], [5,6,7,8]]
a[0]=7 #广播的概念。不能写作"b=a[0];b=7",因为就相当于7赋值给了b。可以写“b=a[0];b[:]=7”。【例9】 a[:]=8 #a的所有元素变成8。相当于第一个轴,从头到尾。所以是所有的。 【15】
【例17】 【例17】 a[1,:2] #返回第二行的前两列。 a[:2,2] #返回第3列的前两行。 a[:2,2]=12 #对切片表达式的赋值操作也会扩散到整个选区。
#假设a=[[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]] 2*2*3的数组 a[1] #为2*3的数组。【例10】 a[1,1] #[10 11 12]。等价于a[1][1]。【例11】 a[0]=7 #广播。不能写作"b=a[0];b=7",因为就相当于7赋值给了b。可以写“b=a[0];b[:]=7”。【例12】【例13】 a[:]=8 #a的所有元素变成8。【例14】
总结:二维数组切片。当仅使用切片(冒号)时,返回的维度为2维。当切片和索引一起使用时(冒号和纯数字),返回的维度是1维。
布尔型索引:略,以后用到再说。 花式索引:略,以后用到再说。
例1:
例2:
例3:
例4:
例5:
例6:
例9:
运行结果: [[7 7 7 7]
例10:
运行结果: [[ 7 8 9]
例11:
例12:
运行结果: [[[ 7 7 7] [[ 7 8 9]
例13:
运行结果: [[1 2 3] #b [[ 7 8 9]
例14:
运行结果: [[[8 8 8] [[8 8 8]
例15:
运行结果: [[1 2 3 4]] #b是一个二维数组。
例16:
运行结果: [[2 3 4]
例17:
运行结果: (2, 4) //a是2维的。
四、数组的变形
五、数组的拼接
六、数组的分裂
|