- 首页 > it技术 > >
整理:杨柳依
【numpy学习笔记】参考资料:《Numpy学习指南(第2版)》
1. numpy 数组
1.1 创建数组
以下省略from numpy import *
- 创建一维数组
>>> a = arange(5) # 创建一维数组
>>> b = array([1,2,3,4,5]) # 创建一维数组
>>> c = array([1,2,3,4,5], dtype=int64) # 指定数据类型
>>> d = array([1,2,3.5])# 传入的list必须是同一类型,否则会自动转换
- 创建多维数组
>>> a = array([[1,2,3],[4,5,6]])# 创建二维数组
>>> a.shape# (2, 3)
>>> a.ndim# 2
>>> a[1,0]# 4
- 获取数组属性
>>> a = arange(5) # array([0, 1, 2, 3, 4])>>> a.dtype # 获取类型
dtype('int32')
>>> a.shape # 获取形状,返回一个元祖,可以看出是一维数组
(5,)
>>> a.ndim# 获取维度,返回一个数字
1
>>> a.size # 返回元素总个数
5
>>> a.itemsize# 返回数组单个元素所占字节数
4
>>> a.nbytes# 返回数组所占总空间
20
>> a.T# 转置,对于一维数组无变化
对于复数元素,有
>>> b = array([1+2j,2+4j])# array([1.+2.j, 2.+4.j])>>> b.real# 获取实部
array([1., 2.])>>> b.imag# 获取虚部
array([2., 4.])
特别的,使用flat
属性获取一个迭代器
>>> a = array([[1,2,3],[4,5,6]])
>>> f = a.flat
>>> for i in a.flat:
print(i," ",type(i))
1
2
3
4
5
6# 注意,使用一个for循环无法取到每一个元素,只能取出[1,2,3]和[4,5,6]>>> a.flat = 9 # 对flat属性赋值会覆盖所有元素
>>> a
array([[9, 9, 9],
[9, 9, 9]])
1.2 数组切片
- 一维数组切片
>>> a = arange(10)# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>> a[3:7]
array([3, 4, 5, 6])>>> a[3:7:2]# 步长为2
array([3, 5])>>> a[::-1]# 步长为-1,相当于翻转
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
- 多维数组切片
>>> a = array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])>>> a[:,0]# 获取第1列,得到一维数组
array([1, 5, 9])>>> a[0,:]# 获取第1行,得到一维数组
array([1, 2, 3, 4])>>> b = array(([[[1,2,3],
[4,5,6]],
[[7,8,9],
[10,11,12]]]))>>> b[0,:,:]# 获取第1张表上的所有数据
array([[1, 2, 3],
[4, 5, 6]])
>>> b[0,...]# 同上,多个连续的冒号(:)可以用省略号(...)代替
>>> b[0]# 同上,后面的冒号可以直接省略>>> b[0,:,-1] # 获取第1张表上所有行最后一列的数据
array([3, 6])>>> b[0,:,::-1]# 将第1张表上所有行的列元素倒序排列
array([[3, 2, 1],
[6, 5, 4]])
1.3 改变数组维度
- 展平数组(降成一维)
>>> b = array(([[[1,2,3],
[4,5,6]],
[[7,8,9],
[10,11,12]]]))>>> b.ravel() # 不改变原数组
array([ 1,2,3,4,5,6,7,8,9, 10, 11, 12])>>> b.flatten()# 不改变原数组
array([ 1,2,3,4,5,6,7,8,9, 10, 11, 12])
- 设置维度
元素个数要与设置的维度相匹配,不然会报错
>> b.shape = (2,6)# 改变原数组,变为2×6的数组,[[1,2,3,4,5,6],[7,8,9,10,11,12]]
>> b.resize((4,3))# 改变原数组,变为4×3的数组
>> b.reshape((3,4))# 不改变原数组,返回3×4的数组
- 数组转置
>>> b = array([[1,2,3,4]])
>>> b.transpose() # 不改变原数组,返回转置后的数组,[[1],[2],[3],[4]]
>>> b.T# 同上
1.4 数组的组合
先产生一些数组
>>> a = arange(9).reshape(3,3)
>>> b = arange(11,14).reshape(1,3)
>>> c = 2*a>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> b
array([[11, 12, 13]])>>> c
array([[ 0,2,4],
[ 6,8, 10],
[12, 14, 16]])
- 水平组合
>>> hstack((a,b.T))
array([[ 0,1,2, 11],
[ 3,4,5, 12],
[ 6,7,8, 13]])>>> concatenate((a,b.T),axis=1)
array([[ 0,1,2, 11],
[ 3,4,5, 12],
[ 6,7,8, 13]])
- 垂直组合
>>> vstack((a,b))
array([[ 0,1,2],
[ 3,4,5],
[ 6,7,8],
[11, 12, 13]])>>> concatenate((a,b),axis=0) # concatenate函数axis参数默认为0,垂直组合
array([[ 0,1,2],
[ 3,4,5],
[ 6,7,8],
[11, 12, 13]])
- 深度组合
>>> dstack((a,c))
array([[[ 0,0],
[ 1,2],
[ 2,4]],[[ 3,6],
[ 4,8],
[ 5, 10]],[[ 6, 12],
[ 7, 14],
[ 8, 16]]])
- 列组合
>>> column_stack((b,b))
array([[11, 12, 13, 11, 12, 13]]) # 对于二维数组,相当于hstack
- 行组合
>>> row_stack((b,b))
array([[11, 12, 13],
[11, 12, 13]])# 对于二维数组,相当于vstack
1.5 数组的分割
- 水平分割
>>> hsplit(a,3)
[array([[0],
[3],
[6]]),
array([[1],
[4],
[7]]),
array([[2],
[5],
[8]])]>>> split(a,3,axis=1) # 与hsplit相同
- 垂直分割
>>> vsplit(a,3)
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]>>> split(a,3,axis=0) # 与vsplit相同
- 深度分割
>>> d = arange(8).reshape(2,2,2)
>>> dsplit(d,2)
[array([[[0],
[2]],
[[4],
[6]]]),
array([[[1],
[3]],
[[5],
[7]]])]
推荐阅读