Python 知识回顾之 Numpy(1)

导入numpy库,并查看numpy版本

import numpy as np
np.__version__

一、创建Array

1.使用np.array()由python列表创建

list1 = [1, 2, 3, 4, 5]
n1 = np.array(list1)
n1

array([1, 2, 3, 4, 5])

numpy默认ndarray的所有元素类型是相同的
如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int

list2 = [1, 2, 3.3, 4.4, 5]
n2 = np.array(list2)
n2

array([1. , 2. , 3.3, 4.4, 5. ])

l3 = ["helloworld",1,2,3.3]
n3 = np.array(l3)
n3

array(['helloworld', '1', '2', '3.3'], dtype='

2.使用numpy的routines函数创建

常见的创建方法

np.ones(shape,dtype=None,order='C')
np.ones(shape=(3, 5), dtype=np.int) 
以1填充

array([ [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1] ])

np.zeros(shape, dtype=float, order='C')

以0填充

np.zeros(shape=(3,3))

array([ [0., 0., 0.], [0., 0., 0.], [0., 0., 0.] ])

np.full(shape, fill_value, dtype=None, order='C')

以指定内容填充

np.full(shape=(3,3), fill_value=6)

array([ [6, 6, 6], [6, 6, 6], [6, 6, 6] ])

np.eye(N, M=None, k=0, dtype=float)

对角线为1其他的位置为0,k为偏移量

np.eye(N=3,k=-1)

array([ [0., 0., 0.], [1., 0., 0.], [0., 1., 0.] ])

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

生成从start到stop的长度为num的等差数列,endpoint表示数列是否包含stop,retstep表示生成的数列中是否包含步长

np.linspace(0, 10, num=11, endpoint=True)

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

np.arange(start, stop, step, dtype=None)

从start(默认0)到stop(不包含stop),以步长step取值填充返回一维数组

np.arange(0,12,step=2)

array([ 0, 2, 4, 6, 8, 10])

np.random.randint(low, high=None, size=None, dtype='l')

以随机数填充,low为最小值,high为最大值

np.random.randint(1,10,size=(2,2))

array([ [9, 6], [1, 3] ])

正态分布函数
  • np.random.randn(d0, d1, ..., dn) 标准正态分布
  • np.random.normal() 普通正态分布
np.random.random(size=None)

生成0到1的随机数,左闭右开

np.random.random(size=(3,4))*2-1 # 生成-1到1的正态分布

二、ndarray的属性

  • ndim:维度
  • shape:形状(各维度的长度)
  • size:总长度
  • dtype:元素类型
  • itemsize:每个元素占的字节数,每个元素的大小
  • flags:内存信息
  • real:数组元素的实部
  • imag:数据元素的虚部
  • data:包含矩阵直的缓冲区地址

三、ndarray的基本操作

1.索引

n = np.array([[27, 88, 5, 49, 97],
      [91, 32, 62, 5, 95],
      [41, 9, 12, 16, 94],
      [ 4, 35, 25, 57, 5 ],
      [48, 60, 96, 59, 18]])

间接访问:n[1][2]
直接访问:n[1, 2]
只读时可以用间接访问,赋值时必须使用直接访问

行访问: n[2]
---> array([41, 9, 12, 16, 94])
列访问: n[:,1]
---> array([88, 32, 9, 35, 60])

访问多个元素: n[1:3, 1:3]
--->array([[32, 62], [ 9, 12]])

可使用列表作为索引取值

n[[1, 2], 1]
--->array([32, 9])

n2[[1,2]][:,[1,3]]
--->array([[32, 5], [ 9, 16]])

使用bool列表对array进行访问,True对应的值会被返回,bool列表的长度必须和该维度匹配

n1 = np.array(['A', 'B', 'C', 'D', 'E'])
index = [True, False, True, False, False]
n1[index]
---> array(['A', 'C'], dtype='

总结:
  1. numpy可以保持与python列表的访问方法,但是要注意高维数组的访问可能存在潜在风险
  2. 多维数组直接访问元素: 以列表的方式表示索引 [d0_loc, d1_loc, d2_loc...]
  3. 多维数组的行访问: n[row_index], 访问多行: n[[row_index1, row_index2...]]
  4. 多维数组的列访问: n[col_index], 访问多列: n[[col_index1, col_index2...]]
  5. BOOL列表访问:
    行访问: n[BOOLLIST]
    列访问: n[:,BOOLLIST]
    【注意】 BOOLLIST的长度必须与访问的维度的长度一致

2.切片

切片操作原理与python列表的切片相同,即arr[start: end: step]

n1 = np.array(['A', 'B', 'C', 'D', 'E'])
n1[1:4]
--->array(['B', 'C', 'D'], dtype='

n = np.array([[27, 88, 5, 49, 97],
      [91, 32, 62, 5, 95],
      [41, 9, 12, 16, 94],
      [ 4, 35, 25, 57, 5 ],
      [48, 60, 96, 59, 18]])
n[0:2, 1:3]
--->array([ [88, 5], [32, 62] ])

n2 = np.array([11, 49, 83, 80, 26, 44, 46, 85, 50, 89])
n2[ : :2]
--->array([11, 83, 26, 46, 50])
n2[ : :-1]
--->array([89, 50, 85, 46, 44, 26, 80, 83, 49, 11])

3.变形

n.reshape(5, 4)
--->array([[47, 4, 77, 86],
    [26, 62, 88, 86],
    [55, 88, 40, 4],
    [18, 22, 10, 18],
    [43, 50, 60, 48]])

n.reshape(-1,1)
--->array([[47],[ 4],[77],[86],[26],[62], [88],[86],[55],[88],[40],[ 4],[18],[22],[10], [18],[43],[50], [60],[48]])

4.级联

np.concatenate() 级联需注意的点:

  • 级联的参数是列表:一定要加中括号或小括号
  • 维度必须相同
  • 形状相符
  • 级联的方向默认是shape中的第一个值所代表的维度方向
  • 可通过axis参数改变级联的方向

n1 = np.random.randint(0, 100, size=(5, 5))
n2 = np.random.randint(0, 100, size=(5, 5))
display(n1, n2)


Python 知识回顾之 Numpy(1)_第1张图片
image.png

np,concatenate([n1, n2], axis=1)


Python 知识回顾之 Numpy(1)_第2张图片
image.png

np.hstack 水平级联 (横向)
np.vstack 垂直级联 (纵向)

5.切分

与级联相似,三个函数完成切分工作:

  • np.split
  • np.vsplit
  • np.hsplit

n1 = np.random.randint(0,100,size=(6,6))


Python 知识回顾之 Numpy(1)_第3张图片
image.png

a1, a2, a3 = np.split(n1, indices_or_sections=3, axis=0)
display(a1, a2, a3)


Python 知识回顾之 Numpy(1)_第4张图片
image.png

n2 = np.random.randint(0,100,size=(5,7))
Python 知识回顾之 Numpy(1)_第5张图片
image.png

a1, a2, a3 = np.split(n2, indices_or_sections=[2,3], axis=0) # 0:2 2:4 4:
display(a1, a2, a3)


Python 知识回顾之 Numpy(1)_第6张图片
image.png

你可能感兴趣的:(Python 知识回顾之 Numpy(1))