第二章:NumPy基础
1、数组对象ndarray
2、数组数据类型
3、NumPy生成伪随机数
4、数组的访问与形态变换
5、使用函数进行简单统计分析
6、通用函数ufunc的运算
7、用于数组的文件输入输出
第1节:数组对象ndarray
1、什么是ndarray
一种存储单一数据类型的多维数组ndarray
2、为什么在NumPy中使用ndarray
NumPy的数组比Python的内置序列,占用更小的内存,执行的速度也更快 NumPy可以在整个数组上执行重复杂的计算,不要需要使用Python的for循环 基于NumPy的算法要比纯Python快10到100倍,可能还更多
示例如下:
In [ ]:
# NumPy数组比Python内置序列,更快,内存更少
import numpy as np
nums = np.arange(10000000)
nums_list = list(range(10000000))
%time for i in range(10): nums = nums * 2
%time for i in range(10): nums_list = [j*2 for j in nums_list]
第2节:创建数组ndarray
1、使用array函数创建数组
In [ ]:
import numpy as np
# 创建一个一维数组
arr = np.array([2, 4, 6, 8, 10])
print(str.format('创建的数组为:{0}', arr))
In [ ]:
import numpy as np
# 创建一个二维数组
arr_two = np.array([[1, 2, 3], [4, 5, 6]])
print(str.format('创建的二维数组为:
{0}', arr_two))
2、数组的常用属性
* ndim 返回int,数组的维数
* shape 返回tuple,数组的尺寸
* size 返回int,数组的元素总数
* dtype 返回data-type,元素类型
* itemsize 返回int,表示数组的每个元素大小,以字节为单位
In [ ]:
import numpy as np
# 创建一个二维数组
arr_two = np.array([[1, 2, 3, 7], [4, 5, 6, 8], [0, 0, 0, 0]])
print(str.format('创建的二维数组为:
{0}', arr_two))
# 查看数组的维数
print(str.format('数组的维数:{0}', arr_two.ndim))
# 查看数组的尺寸
print(str.format('数组的尺寸:{0}', arr_two.shape))
# 查看数组的元素总数
print(str.format('数组的元素总数:{0}', arr_two.size))
# 查看数组的类型
print(str.format('数组的类型:{0}', arr_two.dtype))
# 查看数组的元素大小,以字节为单位
print(str.format('数组的元素大小,以字节为单位:{0}', arr_two.itemsize))
3、数组的数据类型
* int8、uint8 ... int64、uint64
* float16 ... float128
* bool
* object
* sting
* uniccode_
* 等等
In [ ]:
# 设置dtype类型
import numpy as np
arr1 = np.array([1, 2, 3.5, 4], dtype=np.float64)
print(arr1)
arr1.dtype
4、数组的数据类型转换
In [ ]:
import numpy as np
arr1 = np.array([1, 2, 3, 4])
print(arr1)
arr1.dtype
arr2 = arr1.astype(np.float64)
print(arr2)
arr2.dtype
In [ ]:
import numpy as np
print('整型转浮点型', np.float(10))
5、其他创建ndarray数组的方法
* arange函数:创建指定范围的数组
* zeros函数:创建指定行列全为0的数组
* ones函数:创建全1数组
* empty函数:创建一个拥有趋近0值的空数组,值都是垃圾值
* eye函数:创建一个对角矩阵,对角线上值为1
* full函数:创建指定填充的数组
* linspace函数:创建指定范围的一维等差数组
* logspace函数:创建指定范围的一维等比数组
举例如下:
In [ ]:
import numpy as np
arr1 = np.arange(20)
print(arr1)
arr2 = np.zeros((3, 4),dtype=np.float32)
print(arr2)
arr3 = np.ones((3,4))
print(arr3)
arr4 = np.empty((2, 3))
print(arr4)
arr5 = np.eye(3, 4)
print(arr5)
arr6 = np.full((3, 4), 100)
print(arr6)
arr7 = np.linspace(1, 9, 5)
print(arr7)
arr8 = np.logspace(0, 4 , 5, base=2)
print(arr8)
第3节:NumPy生成伪随机数
1、使用random模块生成伪随机数创建数组
函数 | 说明 |
---|---|
seed | 确定随机数生成器的种子 |
permutaion | 返回一个序列的随机排列或返回一个随机排列的数组 |
shuffle(x) | 对一个序列进行随机排序 |
random(n) | 产生[0,1)之间指数量的随机数 |
rand() | |
randint() | |
randn | |
binomial | |
normal | |
beta | |
chisquare | |
gamma | |
uniform | |
choice |
2、示例:
In [ ]:
import numpy as np
# 产生10个[0,1)的随机数
arr1 = np.random.random(10)
print(arr1)
arr2 = np.random.randn(3, 5)
print(arr2)
In [ ]:
import numpy as np
arr3 = np.arange(10)
print(arr3)
# 对数组随机排序
np.random.shuffle(arr3)
print(arr3)
# 对已存在的数组随机读取
arr4 = np.random.choice(arr3, 5)
print(arr4)
第4节:数组的访问与形态变换
1、访问数组
与列表操作类似,有如下操作
- 数组名[下标]
- 数组名[start:end],不包含end
- 数组名[:end],0到end,不包含end
- 数组名[:],取出所有元素
2、通过索引与切片修改元素
- 数组名[下标] = 值
- 数组名[m:n] = 值
示例
In [ ]:
import numpy as np
arr = np.arange(1, 20, 2)
print(arr)
print('取出下标为2的元素:', arr[2])
print('取出倒数第2个元素:', arr[-2])
print('获取数组的一个切片:', arr[2:5])
print('获取数组的一个切片:', arr[:5])
print('获取数组的一个切片:', arr[:])
In [ ]:
import numpy as np
arr = np.arange(1, 20, 2)
print(arr)
arr[0] = 0
print(arr)
arr[0:3] = [100, 99, 98]
print(arr)
arr[-3:-1] = 100
print(arr)
In [ ]:
# 访问多维数组
import numpy as np
# 随机生成5*5矩阵,值为[0, 10)
arr = np.random.randint(0, 100, size=(5, 5))
print(arr)
print('两种写法获取同一个元素:', arr[1][2], arr[1, 2])
print('获取一列元素:', arr[0])
In [ ]:
# 访问多维数组
import numpy as np
# 随机生成5*5矩阵,值为[0, 10)
arr = np.random.randint(0, 100, size=(5, 5))
print(arr)
print('切片操作获取元素:
', arr[0:2])
print('切片操作获取元素:
', arr[1:3, 2:4])
3、变换数组形态
- 改变数组形状
- 利用数组的shape属性(改变原数组)
- 利用reshape函数改变数组形状(原数组不变化)
- .T属性实现数组转置
- 展平数组
- ndarray.ravel()
- ndarray.flatten()
- 组合数组
- 横向组合:np.hstack(arr1, arr2)
- 纵向组合:np.vstack(arr1, arr2)
- 横向组合:np.concatenate((arr1, arr2), axis=1)
- 纵向组合:np.concatenate((arr1, arr2), axis=0)
- 分割数组
- 横向分割:np.hsplit(arr, n)
- 纵向分割:np.vsplit(arr, n)
- 横向分割:np.split(arr, n, axis=1)
- 纵向分割:np.split(arr, n, axis=0)
示例:
In [ ]:
# 1. 改变数组形状
import numpy as np
arr = np.arange(16)
print(arr)
arr.shape = 4, 4
print('改变之后:
', arr)
print(arr)
arr1 = arr.reshape(2, 8)
print('arr1=:
', arr1)
print(arr)
arr2 = arr.T
print(arr2)
print(arr)
In [ ]:
# 2、展平数组
import numpy as np
arr = np.random.randint(0, 10, (3,4))
print('原数组:
', arr)
print('arvel展平数组:
', arr.ravel())
print('原数组:
', arr)
print('flatten横向展平数组:
', arr.flatten())
print('flatten纵向展平数组:
', arr.flatten('F'))
print('原数组:
', arr)
In [ ]:
# 3、组合数组
import numpy as np
arr1 = np.arange(9).reshape(3,3)
print('数组1:
', arr1)
arr2 = np.eye(3, 4)
print('数组2:
', arr2)
arr = np.hstack((arr1, arr2))
print('组合数组:
', arr)
In [ ]:
# 4、分割数组
import numpy as np
arr = np.arange(16).reshape(4,4)
print(arr)
arr1 = np.hsplit(arr, 2)
print(arr1)
第5节:使用函数进行简单统计分析
1、排序
1. 直接排序
* arr.sort(axis=1) 沿横轴排序
* arr.sort(axis=0) 沿纵轴排序
2. 间接排序
* arr.argsort函数返回值为重新排序值的下标
* np.lexsort(a, axis=1, kind='quicksort', order=None)函数返回值是按照最后一个传入数据排序
示例:
In [ ]:
# 一维排序
import numpy as np
arr = np.random.randint(0, 10, size=10)
print(arr)
arr.sort()
print('直接排序后:
', arr)
arr1 = np.random.randint(100, 200, size=10)
print(arr1)
arr2 = arr1.argsort()
print('间接排序后:
', arr2)
print(arr1)
In [ ]:
# 二维排序
import numpy as np
arr = np.random.randint(0, 10, size=(3, 4))
print(arr)
arr.sort(axis=0)
print('排序后:
', arr)
2、去重复数据
* np.unique函数:找出数组中唯一值并返回已排序的结果
示例:
In [ ]:
# 去重
import numpy as np
arr = np.random.randint(0, 10, size=10)
print(arr)
arr1 = np.unique(arr)
print(arr1)
print(arr)
3、重复数据(使数据重复)
* np.tile(A, reps) A为指定重复的数组,reps为指定重复的次数
* np.repeat(a, repeats, axis=None)
示例:
In [ ]:
import numpy as np
arr1 = np.arange(5)
print(arr1)
arr2 = np.tile(arr1, 3)
print(arr2)
arr3 = arr2.reshape(3,5)
print(arr3)
arr4 = np.repeat(arr3, 3, axis=1)
print(arr4)
4、集合运算
* intersect1d(x, y) 返回交集,并排序
* union1d(x, y) 返回并集,并排序
* in1d(x, y) 返回一个X包含于Y的布尔型数组,就是Y中元素在X中则TRUE
* setdiff1d(x, y) 返回差集
* setxor1d(x, y) 对称差,交集之外部分
示例:
In [ ]:
import numpy as np
arr1 = np.random.randint(10, size=10)
print(arr1)
arr2 = np.random.randint(10, size=16)
print(arr2)
print('*' * 40)
jiaoji = np.intersect1d(arr1, arr2)
print('交集:', jiaoji)
binji = np.union1d(arr1, arr2)
print('并集:', binji)
chaji = np.setdiff1d(arr1, arr2)
print('差集:', chaji)
duichengcha = np.setxor1d(arr1, arr2)
print('对称差:', duichengcha)
in1d = np.in1d(arr1, arr2)
print(in1d)
第6节:通用函数ufunc的运算
1、什么是ufunc通用函数
通用函数ufunc是一种对ndarray中的数据执行元素级运算的函数,返回值也是ndarray数组。 常用的ufunc函数有:
- 数组运算函数
- 三角函数
- 位操作函数
- 逻辑与比较运算函数
- 浮动运等函数等等
2、ufunc函数特点
不需要对数组的每一个元素做操作,只需对整个数组操作,对数组做重复运算时,比math库的函数效率更高。
示例:
In [ ]:
import numpy as np
arr = np.array([1,2,3.2,4.5])
print(arr*2, arr//2)
print(arr)
3、ufunc函数的运算
* 四则运算:+、-、*、/、**
* 比较运算 >等
* 逻辑运算:np.any逻辑或,np.all逻辑与。返回布尔值
示例:
In [ ]:
import numpy as np
arr1 = np.random.randint(10, size=(3,3))
arr2 = np.arange(9).reshape(3,3)
print(arr1)
print(arr2)
arr3 = arr1 + arr2
print(arr3)
arr4 = arr1 * arr2
print(arr4)
# 数组比较
arr5 = arr1 > arr2
print('arr1与arr2比较:', arr5)
# 逻辑运算
print('逻辑或操作:', np.any(arr1 == arr2))
print('逻辑与操作:', np.all(arr1 == arr2))
4、常用统计函数
方法 | 说明 |
---|---|
sum | 求和 |
mean | 求平均 |
std var | 标准差、方差 |
min max | 最小值、最大值 |
argmin argmax | 求最大最小元素的索引 |
cumsum | 求所有元素的累计和 |
cumprod | 求所有元素的累计积 |
示例:
In [23]:
import numpy as np
arr = np.arange(12).reshape(3,4)
print(arr)
In [30]:
# 求数组和
sum = np.sum(arr)
print(sum)
# 求某行和
sum_col1 = np.sum(arr[2])
print(sum_col1)
# 求纵轴和
sum_0 = arr.sum(axis=0)
print(sum_0)
In [32]:
# 求均值
mean = np.mean(arr)
print(mean)
# 求每行均值
mean_1 = arr.mean(axis=1)
print(mean_1)
In [33]:
print(np.min(arr))
print(np.argmax(arr))
print(np.cumsum(arr))
第7节:用于数组文件输入输出
numpy能够读写磁盘上的文本数据或二进制数据
1、读写二进制文件
* np.save(path, arr)
* np.load(path)
* np.savez(path, arr1, arr2,...):可以将多个数组保存到一个文件中。用load读取多个数组时得到的不是一个数组,而是NpzFile类型,第一个数组键arr_0
示例:
In [34]:
# 读写二进制文件
import numpy as np
arr = np.random.randn(5,4)
print(arr)
In [35]:
# 保存二进制文件
import os
try:
# 在当前目录下创建文件
os.mkdir("file")
np.save("file/datas", arr)
print('保存成功!!!')
except(FileExistsError):
print('目录已存在!')
except:
print('保存失败!!!')
In [36]:
# 读取二进制文件
arr_read = np.load('file/datas.npy') # 读取要扩展名
print('从文件中读取的数组为:
', arr_read)
In [41]:
# 保存多个数组
arr1 = np.arange(10)
arr2 = np.random.randint(0, 10, size=(2,2))
try:
np.savez('file/mul_datas', arr, arr1, arr2)
print('保存成功!!!')
except(FileExistsError):
print('目录已存在!')
except:
print('保存失败!!!')
In [42]:
# 读取多个数组文件.npz
arr_mul = np.load('file/mul_datas.npz')
for key in arr_mul:
print('从文件中读取的数组为:
', arr_mul[key])
2、读写文本文件(或csv文件)
* np.savetxt(path, arr, fmt="%.18e", delimiter="")
将数组写到某种分隔符隔开的文本文件中,数据格式为 %.18e,分隔符默认为空格
* np.loadtxt(path, delimiter="")
示例:
In [43]:
# 读定文本文件
import numpy as np
arr = np.random.randn(5, 4)
print(arr)
In [55]:
# 保存文本文件
import os
try:
# 在当前目录下创建文件
os.mkdir("file_text")
np.savetxt("file_text/datas.txt", arr, delimiter=",")
print('保存成功!!!')
except(FileExistsError):
print('目录已存在!')
except:
print('保存失败!!!')
In [56]:
# 读取文本文件
arr_text = np.loadtxt("file_text/datas.txt", delimiter=",")
print(arr_text)
In [ ]: