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:

import numpy as np

 

a=np.arange(10)               //
b=a.reshape(2,5)              //后面讲。

 

print(b.ndim)                       #2。二维数组,所以维度为2。

例2:

import numpy as np

 

a=np.arange(12)
b=a.reshape(2,3,2)

 

print(b.ndim)                       #3。三维数组。
print(b.shape)                     #(2,3,2)。返回的是表示各维度大小的元组。

例3:返回数组中元素的类型。

import numpy as np

 

a=np.arange(10) 

print(a.dtype)                      #int32。

例4:

import numpy as np

 

a=np.arange(10)

print(a.size)                        #10。因为有10个元素。

 

 

二、数组的索引

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:

numpy(3)——numpy数组性质:属性、索引、切片、变形、拼接、分裂

结果:

numpy(3)——numpy数组性质:属性、索引、切片、变形、拼接、分裂

 

 

三、数组的切片

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维。

                                         numpy(3)——numpy数组性质:属性、索引、切片、变形、拼接、分裂

 

布尔型索引:略,以后用到再说。

花式索引:略,以后用到再说。

 

 

例1:

a=np.arange(10)


b=a[5]
print(b)                    #5

 

c=a[5:8]

print(c)                    #[5,6,7]

例2:

import numpy as np

 

a=np.arange(10)
a[1]=5
print(a)                     #[0 5 2 3 4 5 6 7 8 9]

 

例3:

import numpy as np

 

a=np.arange(10)
a[5:8]=12
print(a)                     #[ 0  1  2  3  4 12 12 12  8  9]

例4:

import numpy as np

 

a=np.arange(10)
a[:]=12
print(a)                       #[12 12 12 12 12 12 12 12 12 12]

例5:

import numpy as np

 

a=np.arange(10)
print(a)                         #[0 1 2 3 4 5 6 7 8 9]

 

b=a[5:8]                       #[5 6 7]
print(b)

 

b[:]=12
print(b)                         #[12 12 12]
print(a)                         #[ 0  1  2  3  4 12 12 12  8  9]。a也跟着改变了。

例6:

import numpy as np

a=np.arange(10)
print(a)


b=a[5:8].copy()             #[5,6,7]。得到的是ndarray切片的一份副本而非视图。
print(b)


b[:]=12                          #[12,12,12]
print(b)
print(a)                          #[1,2,3,4,5,6,7,8,9]。a就不跟随b变化了。

 

 

例9:

import numpy as np

a=np.array([[1,2,3,4],[5,6,7,8]])
b=a[0]
b[:]=7
print(a)

运行结果:

[[7 7 7 7]
 [5 6 7 8]]

 

例10:

import numpy as np

 

a=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])

b=a[1]

print(b)

运行结果:

[[ 7  8  9]
 [10 11 12]]

 

例11:

import numpy as np

 

a=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])

b=a[1,1]

print(b)                                #[10 11 12]

例12:

import numpy as np

a=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])


a[0]=43                           
print(a)

运行结果:

[[[ 7  7  7]
  [ 7  7  7]]

 [[ 7  8  9]
  [10 11 12]]]

 

例13:

import numpy as np

a=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])

 

b=a[0]
print(b)

 

b[:]=7                      #这个地方不能写“b=7”。这样写的话,就相当于变量b变成了7。跟数组没啥关系了。

print(a)                   #a如果也变化,说明不是副本。

运行结果:

[[1 2 3]                        #b
 [4 5 6]]
[[[ 7  7  7]                    #说明不是副本。
  [ 7  7  7]]

 [[ 7  8  9]
  [10 11 12]]]

 

例14:

import numpy as np

 

a=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])

a[:]=8

print(a)

运行结果:

[[[8 8 8]
  [8 8 8]]

 [[8 8 8]
  [8 8 8]]]

 

例15:

import numpy as np

a=np.array([[1,2,3,4],
            [5,6,7,8]])

 

b=a[:1]

print(b)
print(b.shape)

运行结果:

[[1 2 3 4]]                    #b是一个二维数组。
(1, 4)

 

例16:

import numpy as np

a=np.array([[1,2,3,4],
            [5,6,7,8]])

 

b=a[:2,1:]

print(b)
print(b.shape)

运行结果:

[[2 3 4]
 [6 7 8]]
(2, 3)

 

例17:

import numpy as np

a=np.array([[1,2,3,4],
            [5,6,7,8]])
print(a.shape)

 

b=a[:,0]
print(b)
print(b.shape)

 

c=a[:,:1]
print(c)
print(c.shape)

 

运行结果:

(2, 4)                //a是2维的。
[1 5]
(2,)                   //b是一维的。
[[1]
 [5]]
(2, 1)                //c是2维的。

 

 

 

 

 

四、数组的变形

 

 

五、数组的拼接

 

 

六、数组的分裂