科学计算库Numpy

文章目录

  • 科学计算库Numpy
    • 一、numpy概述
      • 1. numpy`历史`
        • 2. numpy的核心:多维数组+数值计算
    • 二、Numpy基础
      • ndarray数组
        • 1. 内存中的ndarray对象
          • 元数据(metadata)
          • 实际数据
        • 2. ndarray数组对象的特点
        • 3. ndarray数组对象的创建
          • 1) np.array(任何可被解释为Numpy数组的逻辑结构)
          • 2) np.arange(起始值(0),终止值,步长(1))
          • 3) np.zeros(shape, dtype='类型')
          • 4) np.ones(shape, dtype='类型')
          • 5) np.ones_like(ary)
          • 6) np.zeros_like(ary)
          • 7) np.linspace(起始值,终止值,个数)
        • 4. ndarray对象属性的基本操作
          • 1) 数组的维度:np.ndarray.shape
          • 2) 元素的类型:np.ndarray.dtype
          • 3) 数组元素的个数:np.ndarray.size
        • 5. 数组元素索引(下标)
        • 6. ndarray数组切片操作
          • 1) 切片语法
          • 2) 一维数组切片
          • 3) 多维数组的切片操作
        • 7. ndarray对象属性操作详解
          • 1)Numpy的内部基本数据类型
          • 2) 类型字符码(简写)
        • 8. 自定义复合类型
        • 9. ndarray数组维度操作
          • 1)视图变维(数据共享)
          • 2)复制变维(数据独立)
          • 3)就地变维
        • 10. ndarray数组的掩码操作
        • 11. 多维数组的组合与拆分
          • 1) 垂直方向操作:
          • 2) 水平方向操作:
          • 3) 深度方向操作:
          • 4) 多维数组组合与拆分的相关函数:
        • 12. ndarray类的其他属性

科学计算库Numpy

一、numpy概述

  • Numerical Python,数值的Python,补充了Python语言所欠缺的数值计算能力。
  • Numpy是其它数据分析及机器学习库的底层库。
  • Numpy完全标准C语言实现,运行效率充分优化。
  • Numpy开源免费。

1. numpy历史

  • 1995年,Numeric,Python语言数值计算扩充。
  • 2001年,Scipy->Numarray,多维数组运算。
  • 2005年,Numeric+Numarray->Numpy。
  • 2006年,Numpy脱离Scipy成为独立的项目。
2. numpy的核心:多维数组+数值计算
  1. 代码简洁:减少Python代码中的循环。
  2. 底层实现:厚内核©+薄接口(Python),保证性能。

二、Numpy基础

ndarray数组

1. 内存中的ndarray对象
元数据(metadata)

存储对目标数组的描述信息,如:ndim、dimensions、dtype、data等。

实际数据

将实际数据与元数据分开存放,一方面提高了内存空间的使用效率,另一方面减少对实际数 据的访问频率,提高性能。

2. ndarray数组对象的特点
  • Numpy数组是同质数组,即所有元素的数据类型必须相同
  • Numpy数组的下标从0开始,最后一个元素的下标为数组长度减1
3. ndarray数组对象的创建
1) np.array(任何可被解释为Numpy数组的逻辑结构)
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
print(a)
2) np.arange(起始值(0),终止值,步长(1))
import numpy as np
a = np.arange(0, 5, 1)
print(a)
b = np.arange(0, 10, 2)
print(b)
3) np.zeros(shape, dtype=‘类型’)
import numpy as np
a = np.zeros(10)
print(a)
4) np.ones(shape, dtype=‘类型’)
import numpy as np
a = np.ones(10)
print(a)
5) np.ones_like(ary)
import numpy as np
ary = np.array([1,2,3,4,5])
res = np.ones_like(ary)
print(res)
6) np.zeros_like(ary)
import numpy as np
ary = np.array([1,2,3,4,5])
res = np.zeros_like(ary)
print(res)
7) np.linspace(起始值,终止值,个数)
import numpy as np
ary = np.linspace(-10,10,200)
print(ary)
  1. np.random.normal(期望值,标准差,个数)
import numpy as np
ary = np.random.normal(0,1,100)
print(ary)
4. ndarray对象属性的基本操作
1) 数组的维度:np.ndarray.shape
import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary), ary, ary.shape)
#二维数组
ary = np.array([
    [1,2,3,4],
    [5,6,7,8]
])
print(type(ary), ary, ary.shape)
2) 元素的类型:np.ndarray.dtype
import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary), ary, ary.dtype)
#转换ary元素的类型
b = ary.astype(float)
print(type(b), b, b.dtype)
#转换ary元素的类型
c = ary.astype(str)
print(type(c), c, c.dtype)
3) 数组元素的个数:np.ndarray.size
import numpy as np
ary = np.array([
    [1,2,3,4],
    [5,6,7,8]
])
#观察维度,size,len的区别
print(ary.shape, ary.size, len(ary))
5. 数组元素索引(下标)

数组对象[…, 页号, 行号, 列号]

下标从0开始,到数组len-1结束。

import numpy as np
a = np.array([[[1, 2],
               [3, 4]],
              [[5, 6],
               [7, 8]]])
print(a, a.shape)
print(a[0])
print(a[0][0])
print(a[0][0][0])
print(a[0, 0, 0])
for i in range(a.shape[0]):
    for j in range(a.shape[1]):
        for k in range(a.shape[2]):
            print(a[i, j, k])
6. ndarray数组切片操作
1) 切片语法

​ 二维数组[行的切片,列的切片]

​ 三维数组[页的切片,行的切片,列的切片]

# 数组对象切片的参数设置与列表切面参数类似
#  步长+:默认切从首到尾
#  步长-:默认切从尾到首
数组对象[起始位置:终止位置:步长, ...]
# 默认位置步长:1
2) 一维数组切片
import numpy as np
a = np.arange(1, 10)
print(a)  # 1 2 3 4 5 6 7 8 9
print(a[:3])  # 1 2 3
print(a[3:6])   # 4 5 6
print(a[6:])  # 7 8 9
print(a[::-1])  # 9 8 7 6 5 4 3 2 1
print(a[:-4:-1])  # 9 8 7
print(a[-4:-7:-1])  # 6 5 4
print(a[-7::-1])  # 3 2 1
print(a[::])  # 1 2 3 4 5 6 7 8 9
print(a[:])  # 1 2 3 4 5 6 7 8 9
print(a[::3])  # 1 4 7
print(a[1::3])  # 2 5 8
print(a[2::3])  # 3 6 9
3) 多维数组的切片操作
import numpy as np
a = np.arange(1, 28)
a.resize(3,3,3)
print(a)
#切出1页 
print(a[1, :, :])		
#切出所有页的1行
print(a[:, 1, :])		
#切出0页的1行1列
print(a[0, :, 1])		
7. ndarray对象属性操作详解
1)Numpy的内部基本数据类型
类型名 类型表示符
布尔型 bool_
有符号整数型 int8(-128~127) / int16 / int32 / int64
无符号整数型 uint8(0~255) / uint16 / uint32 / uint64
浮点型 float16 / float32 / float64
复数型 complex64 / complex128
字串型 str_,每个字符用32位Unicode编码表示
日期类型 datetime64
2) 类型字符码(简写)
类型 字符码
np.bool_ ?
np.int8/16/32/64 i1 / i2 / i4 / i8
np.uint8/16/32/64 u1 / u2 / u4 / u8
np.float/16/32/64 f2 / f4 / f8
np.complex64/128 c8 / c16
np.str_ U
np.datetime64 M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s]
8. 自定义复合类型
# 自定义复合类型
import numpy as np

data=[
	('zs', [90, 80, 85], 15),
	('ls', [92, 81, 83], 16),
	('ww', [95, 85, 95], 15)
]
#第一种设置dtype的方式
a = np.array(data, dtype='U3, 3int32, int32')
print(a)
print(a[0]['f0'], ":", a[1]['f1'])
print("=====================================")

#第二种设置dtype的方式
c = np.array(data, dtype={'names': ['name', 'scores', 'ages'],
                    'formats': ['U3', '3int32', 'int32']})
print(c[0]['name'], ":", c[0]['scores'], ":", c.itemsize)
print("=====================================")

#测试日期类型数组
f = np.array(['2011', '2012-01-01', '2013-01-01 01:01:01','2011-02-01'])
f = f.astype('M8[D]')
f = f.astype('i4')
print(f[3]-f[0])

f.astype('bool')
9. ndarray数组维度操作
1)视图变维(数据共享)

reshape() 与 ravel()

import numpy as np
a = np.arange(1, 9)
print(a)		# [1 2 3 4 5 6 7 8]
b = a.reshape(2, 4)	#视图变维  : 变为2行4列的二维数组
print(b)
c = b.reshape(2, 2, 2) #视图变维    变为2页2行2列的三维数组
print(c)
d = c.ravel()	#视图变维	变为1维数组
print(d)
2)复制变维(数据独立)

flatten()

e = c.flatten()
print(e)
a += 10
print(a, e, sep='\n')
3)就地变维

resize直接改变原数组对象的维度,不返回新数组

a.shape = (2, 4)
print(a)
a.resize(2, 2, 2)
print(a)
10. ndarray数组的掩码操作
import numpy as np
a = np.arange(1, 10)
mask = [True, False,True, False,True, False,True, False,True]
print(a[mask])
11. 多维数组的组合与拆分
1) 垂直方向操作:
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
# 垂直方向完成拆分操作,生成两个数组
d, e = np.vsplit(c, 2)
2) 水平方向操作:
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 水平方向完成组合操作,生成新数组 
c = np.hstack((a, b))
# 水平方向完成拆分操作,生成两个数组
d, e = np.hsplit(c, 2)
3) 深度方向操作:
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 深度方向(3维)完成组合操作,生成新数组
i = np.dstack((a, b))
# 深度方向(3维)完成拆分操作,生成两个数组
k, l = np.dsplit(i, 2)
4) 多维数组组合与拆分的相关函数:
# 通过axis作为关键字参数指定组合的方向,取值如下:
# 若待组合的数组都是二维数组:
#	0: 垂直方向组合
#	1: 水平方向组合
# 若待组合的数组都是三维数组:
#	0: 垂直方向组合
#	1: 水平方向组合
#	2: 深度方向组合
np.concatenate((a, b), axis=0)
# 通过给出的数组与要拆分的份数,按照某个方向进行拆分,axis的取值同上
np.split(c, 2, axis=0)
12. ndarray类的其他属性
  • shape - 维度
  • dtype - 元素类型
  • size - 元素数量
  • ndim - 维数,len(shape)
  • itemsize - 元素字节数
  • nbytes - 总字节数 = size x itemsize
  • real - 复数数组的实部数组
  • imag - 复数数组的虚部数组
  • T - 数组对象的转置视图
  • flat - 扁平迭代器
import numpy as np
a = np.array([[1 + 1j, 2 + 4j, 3 + 7j],
              [4 + 2j, 5 + 5j, 6 + 8j],
              [7 + 3j, 8 + 6j, 9 + 9j]])
print(a.shape)
print(a.dtype)
print(a.ndim)
print(a.size)
print(a.itemsize)
print(a.nbytes)
print(a.real, a.imag, sep='\n')
print(a.T)
print([elem for elem in a.flat])
b = a.tolist()
print(b)

你可能感兴趣的:(科学计算库Numpy)