数据分析入门之Numpy数组对象学习

1、掌握 NumPy 数组对象 ndarray

1.1、 数组属性:ndarray(数组)是存储单一数据类型的多维数组。

属性 说明
ndim 返回 int。表示数组的维数
shape 返回 tuple。表示数组的尺寸,对于 n 行 m 列的矩阵,形状为(n,m)
size 返回 int。表示数组的元素总数,等于数组形状的乘积
dtype 返回 data-type。描述数组中元素的类型
itemsize 返回 int。表示数组的每个元素的大小(以字节为单位)

1.2、数组创建

numpy.array(object, dtype=None, copy=True, order=‘K’,subok=False, ndmin=0)

参数名称 说明
object 接收array。表示想要创建的数组。无默认。
dtype 接收data-type。表示数组所需的数据类型。如果未给定,则选择保存对象所需的最小类型。默认为None。
ndmin 接收int。指定生成数组应该具有的最小维数。默认为None。

(1) 创建一个一维数组

import numpy as np
np.array([1,2,3])#这是一个一维数组

结果:

array([1, 2, 3])
import numpy as np
a = np.array([1,2,3])#这是一个一维数组
a.size#结果为3
a.shape#结果为(3,)

(2) 创建一个二维数组

import numpy as np
np.array([[1,2,3],[1,2,4]])#这是一个二维数组
array([[1, 2, 3],
       [1, 2, 4]])
  • 查看相关信息
import numpy as np
a = np.array([[1,2,3],[1,2,4]])#这是一个二维数组

a.size #结果为6
a.ndim #维度结果为2
a.shape #2行3列(2,3)

a.dtype
dtype('int32')

(3) 强制转化类型

a = np.array([[1,2,3],[1,2,4]],dtype=np.float32)#这是一个二维数组
a.dtype

结果:

dtype('float32')

1.2.1、重新设置数组的 shape 属性

  • 把上面2行3列的数据改为3行2列
a.reshape(3,2)

结果:

array([[1., 2.],
       [3., 1.],
       [2., 4.]], dtype=float32)

1.2.2、使用 arange 函数创建数组

list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

1.2.3、使用 linspace 函数创建数组——等差

np.linspace( start, stop,num=50, endpoint=True, retstep=False, dtype=None, axis=0)
  • num默认为50
np.linspace(0,10)#0~1,默认50个

结果:

array([ 0.        ,  0.20408163,  0.40816327,  0.6122449 ,  0.81632653,
        1.02040816,  1.2244898 ,  1.42857143,  1.63265306,  1.83673469,
        2.04081633,  2.24489796,  2.44897959,  2.65306122,  2.85714286,
        3.06122449,  3.26530612,  3.46938776,  3.67346939,  3.87755102,
        4.08163265,  4.28571429,  4.48979592,  4.69387755,  4.89795918,
        5.10204082,  5.30612245,  5.51020408,  5.71428571,  5.91836735,
        6.12244898,  6.32653061,  6.53061224,  6.73469388,  6.93877551,
        7.14285714,  7.34693878,  7.55102041,  7.75510204,  7.95918367,
        8.16326531,  8.36734694,  8.57142857,  8.7755102 ,  8.97959184,
        9.18367347,  9.3877551 ,  9.59183673,  9.79591837, 10.        ])
  • 限定个数
np.linspace(0,10,10)#限定10个
array([ 0.        ,  1.11111111,  2.22222222,  3.33333333,  4.44444444,
        5.55555556,  6.66666667,  7.77777778,  8.88888889, 10.        ])
  • 限定结束值:
np.linspace(0,10,10,endpoint=False)#从0到9,不包括10在内

等价于

np.linspace(0,9,10)#限定10个
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

1.2.4、使用 logspace 函数创建数列——等比

np.logspace( start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0 )
  • 默认公比为10
np.logspace(0,10,10,endpoint=False)#base为公比10
array([1.e+00, 1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05, 1.e+06, 1.e+07,
       1.e+08, 1.e+09])
  • 相当于上一等差数列的10次幂
10**np.linspace(0,10,10,endpoint=False)

array([1.e+00, 1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05, 1.e+06, 1.e+07,
       1.e+08, 1.e+09])
  • 设置公比为2
np.logspace(0,10,10,endpoint=False,base=2)#公比为2
array([  1.,   2.,   4.,   8.,  16.,  32.,  64., 128., 256., 512.])

1.2.5、使用zeros函数创建数组——全“0”

  • 1行2列
np.zeros((2))
array([0., 0.])
  • 2行3列
np.zeros((2,3))#2行3列
array([[0., 0., 0.],
       [0., 0., 0.]])

1.2.6、使用ones函数创建数组——全“1”

  • 1 行 3 列
np.ones((3))
array([1., 1., 1.])
  • 3行5列
np.ones((3,5))
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])

1.2.7、使用eye函数创建数组——对角线为“1”

  • 1 行 3列
np.eye((3))
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

1.2.8、使用diag函数创建数组——对角线为指定内容

  • 对角线为1,2,3,4
np.diag((1,2,3,4))
array([[1, 0, 0, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 0],
       [0, 0, 0, 4]])

1.3、数组数据类型

  • NumPy基本数据类型与其取值范围(只展示一部分)
类型 描述
bool 用一位存储的布尔类型(值为TRUE或FALSE)
inti 由所在平台决定其精度的整数(一般为int32或int64)
int8 整数,范围为−128至127
int16 整数,范围为−32768至32767
int32 整数,范围为-2^31 至 2^32 -1
  • 创建数组
np.array([1,2,3])
array([1, 2, 3])
  • 查看类型
np.array([1,2,3]).dtype
dtype('int32')

1.3.1、数据类型转换

  • 在使用array函数创建数组时,数组的数据类型默认是浮点型。自定义数组数据,则可以预先指定数据类型

(1) 把32位转换为8位

  • 指定数据类型
np.array([1,2,3],dtype=np.int8)
array([1, 2, 3], dtype=int8)
  • 查看数据类型
a = np.array([1,2,3],dtype=np.int8)
a.dtype
dtype('int8')

(2) 把8位转换为32位

b = np.int32(a)
b.dtype
dtype('int32')


2、生成随机数

2.1、无约束条件下生成随机数

  • np.random.random(size=5),size只有一个值,可以忽略不写,范围是0~1之间,不包括1,浮点型数值
np.random.random(5)
array([0.36310196, 0.14207322, 0.0737932 , 0.98477148, 0.80380514])
  • 随机生成范围在0~1之间的二维数组
np.random.random(size=(2,3))
array([[0.94727277, 0.65118965, 0.17318994],
       [0.06562574, 0.18040911, 0.34669738]])

2.2、生成服从均匀分布的随机数

np.random.rand(2,3)
array([[0.38608332, 0.12179838, 0.18462742],
       [0.53765068, 0.12882099, 0.52347163]])
  • 2个维度的2行3列数组
np.random.rand(2,2,3)#第一个2表示维度,(2,3)表示2行3列
array([[[0.57951376, 0.31890818, 0.69303659],
        [0.59486505, 0.79720304, 0.13110962]],

       [[0.33119501, 0.70135721, 0.8722298 ],
        [0.71925445, 0.67850433, 0.16578164]]])

2.3、生成服从正态分布的随机数

np.random.randn(2,2,3)#第一个2表示维度,(2,3)表示2行3列正态分布
array([[[-0.88786051,  0.75810713,  0.69680607],
        [ 1.07179959, -0.6339035 ,  0.43253647]],

       [[ 2.25968166,  0.17084194, -0.90667182],
        [ 0.99405285, -0.92300171,  0.48305359]]])

2.4、生成给定上下范围的随机数

  • 如创建一个最小值不低于2、最大值不高于10的2行5列数组
np.random.randint(0,10,size=(2,3))#0~10,不包括10
array([[4, 6, 9],
       [4, 0, 9]])


3、通过索引访问数组

3.1、一维数组的索引

arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

(1) 用整数作为下标可以获取数组中的某个元素

arr[5]
5

(2) 用范围作为下标获取数组的一个切片,包括arr[3]不包括arr[5]

arr[3:5]
array([3, 4])

(3) 省略开始下标,表示从arr[0]开始

arr[:5]
array([0, 1, 2, 3, 4])

(4) 下标可以使用负数,-1表示从数组后往前数的第一个元素

arr[-1]
9

(5) 下标还可以用来修改元素的值

arr[2:4] = 100,101
arr
array([  0,   1, 100, 101,   4,   5,   6,   7,   8,   9])

(6) 范围中的第三个参数表示步长,2表示隔一个元素取一个元素

arr[1:-1:2]
array([  1, 101,   5,   7])

(7) 步长为负数时,开始下标必须大于结束下标,如5>2,往左取值

arr[5:1:-2]
array([  5, 101])

3.2、二维数组的索引

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

(1) 索引第0行中第3和4列的元素

arr[0,3:5]
array([4, 5])

(2) 索引第2和3行中第3~5列的元素

arr[1:,2:]
array([[ 6,  7,  8],
       [ 9, 10, 11]])

(3) 索引第3列的元素

arr[:,2]
array([3, 6, 9])

(4) 从两个序列的对应位置取出两个整数来组成下标:arr[0,1], arr[1,2]

arr[0,1]
2

(5) 索引第2、3行中第0、2、3列的元素

arr[1:,(0,2,3)]
array([[ 4,  6,  7],
       [ 7,  9, 10]])

(6) 布尔值索引访问数据

  • mask是一个布尔数组,它索引第1、3行中第2列的元素
mask = np.array([1,0,1],dtype = np.bool)
mask
array([ True, False,  True])
arr[mask,2]
array([3, 9])


4、变换数组的形态

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

4.1、改变数组形状

(1) 设置数组的形状

arr.reshape(3,4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

(2) 查看数组维度

arr.reshape(3,4).ndim
2

4.2、使用ravel函数展平数组

(1) 创建一个二维数组

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

(2) 横向展平

arr.ravel()
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

4.3、使用flatten函数展平数组

(1) 创建一个二维数组

a = np.array([[0,2,9],[7,9,5]])
a
array([[0, 2, 9],
       [7, 9, 5]])

(2) 横向展平

a.flatten()
array([0, 2, 9, 7, 9, 5])

(3) array([0, 2, 9, 7, 9, 5])

a.flatten('F')
array([0, 7, 2, 9, 9, 5])

4.4、组合数组

a = np.arange(10).reshape(2,5)
b = np.linspace(0,1,endpoint=False,num=10).reshape(2,5)

在这里插入图片描述
(1) 使用vstack函数实现数组纵向组合:np.vstack((arr1,arr2))

np.vstack((a,b))#纵向合并,上下堆叠
array([[0. , 1. , 2. , 3. , 4. ],
       [5. , 6. , 7. , 8. , 9. ],
       [0. , 0.1, 0.2, 0.3, 0.4],
       [0.5, 0.6, 0.7, 0.8, 0.9]])

(2) 使用hstack函数实现数组横向组合:np.hstack((arr1,arr2))

np.hstack((a,b))#横向合并,左右拼接
array([[0. , 1. , 2. , 3. , 4. , 0. , 0.1, 0.2, 0.3, 0.4],
       [5. , 6. , 7. , 8. , 9. , 0.5, 0.6, 0.7, 0.8, 0.9]])

(3) 使用concatenate函数实现数组纵向组合

np.concatenate((a,b),axis=0)#相当于vstack(),默认axis=0
array([[0. , 1. , 2. , 3. , 4. ],
       [5. , 6. , 7. , 8. , 9. ],
       [0. , 0.1, 0.2, 0.3, 0.4],
       [0.5, 0.6, 0.7, 0.8, 0.9]])

(4) 使用concatenate函数实现数组横向组合

np.concatenate((a,b),axis=1)#相当于hstack()
array([[0. , 1. , 2. , 3. , 4. , 0. , 0.1, 0.2, 0.3, 0.4],
       [5. , 6. , 7. , 8. , 9. , 0.5, 0.6, 0.7, 0.8, 0.9]])

4.5、切割数组

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

(1) 使用hsplit函数和split函数实现数组横向分割:

np.hsplit(arr, 4)
[array([[0],
        [4],
        [8]]), array([[1],
        [5],
        [9]]), array([[ 2],
        [ 6],
        [10]]), array([[ 3],
        [ 7],
        [11]])]

等价于:

np.split(arr,4,axis=1)
[array([[0],
        [4],
        [8]]), array([[1],
        [5],
        [9]]), array([[ 2],
        [ 6],
        [10]]), array([[ 3],
        [ 7],
        [11]])]

(2) 使用vsplit函数和split函数实现数组纵向分割:

np.vsplit(arr,3)
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]

等价于:

np.split(arr,3,axis=0)
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
发布了62 篇原创文章 · 获赞 25 · 访问量 9299

猜你喜欢

转载自blog.csdn.net/ayouleyang/article/details/103962718