ndarray:多维数组对象
以下内容参考书《利用Python进行数据分析》。
numpy 官方的学习文档
https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
1.创建ndarray
创建数组最简单的方法是使用array 函数。它接受一切序列型的对象。
import numpy as np
data1 = [6,7.5,8,0,1]
arr1 = np.array(data1)
arr1
Out[4]: array([ 6. , 7.5, 8. , 0. , 1. ])
每一个数组都有一个 shape 和一个 dtype
arr1.shape
Out[5]: (5L,)
arr1.dtype
Out[6]: dtype('float64')
zeros 和函数 ones 创建指定 长度或形状的全0全1数组。empty创建没有任何具体值的数组
np.zeros(7)
Out[9]: array([ 0., 0., 0., 0., 0., 0., 0.])
np.ones((2,3))
Out[10]:
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
np.empty((2,3))
Out[11]:
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
2.数据类型转换
astype
整数转为浮点数时,小数部分会被截断
arr = np.array([3.7,-1.2,-2.6,0.5])
arr
Out[14]: array([ 3.7, -1.2, -2.6, 0.5])
arr.astype(np.int32)
Out[15]: array([ 3, -1, -2, 0])
某字符串数组表示的全是数字也可以用astype转换
num_str = np.array(['1.25','-3.6','24'],dtype = np.string_)
num_str.astype(float)
Out[18]: array([ 1.25, -3.6 , 24. ])
3.数组和标量之间的运算
大小相等的数组间的任何算术运算都会将运算应用到元素级
4.索引和切片
索引:选取数组的子集或单个元素
下标从0开始,左闭右开
arr = np.arange(10)
arr
Out[20]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[5:8]
Out[21]: array([5, 6, 7])
arr[5:8]=12
arr
Out[23]: array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
arr_slice = arr[5:8]
arr_slice[1]=123
arr
Out[26]: array([ 0, 1, 2, 3, 4, 12, 123, 12, 8, 9])
arr_slice[:]=64
arr
Out[28]: array([ 0, 1, 2, 3, 4, 64, 64, 64, 8, 9])
5.数组的转置和轴对换
计算矩阵内积
arr = np.random.randn(6,3)
np.dot(arr.T,arr)
Out[30]:
array([[ 8.46291352, -6.53225698, -0.56153338],
[-6.53225698, 9.06106344, 2.52970761],
[-0.56153338, 2.52970761, 5.57303457]])
6.通用函数
通用函数是一种对ndarray中的数据执行元素级运算的函数
square: 计算各元素的平方
sign:计算元素的正负号
ceil:大于等于该值的最小整数
floor:小于等于该值的最大整数
rint: 四舍五入,保留dtype
modf:将数组以小数部分和整数部分两个独立的数组形式返回
7.将条件逻辑表述为数组运算
numpy.where 函数
两个值数组和一个布尔数组
xarr = np.array([1.1,1.2,1.3])
yarr = np.array([2.1,2.2,2.3])
cond = np.array([True,False,True)]
cond = np.array([True,False,True])
result = np.where(cond,xarr,yarr)
result
Out[7]: array([ 1.1, 2.2, 1.3])
将随机数组的正值替换为2
arr = np.random.randn(3,3)
arr
Out[13]:
array([[-0.66787606, 0.94647356, -0.50731958],
[ 1.09635393, -0.24440493, 0.33180244],
[ 0.11577465, -0.36681824, 0.87039169]])
np.where(arr > 0,2,arr)
Out[14]:
array([[-0.66787606, 2. , -0.50731958],
[ 2. , -0.24440493, 2. ],
[ 2. , -0.36681824, 2. ]])
8.排序
arr = np.random.randn(5)
arr
Out[20]: array([-1.35004544, 0.83532214, 1.01864971, 0.60209129, 0.18729369])
arr.sort()
arr
Out[22]: array([-1.35004544, 0.18729369, 0.60209129, 0.83532214, 1.01864971])
多维数组可以对某一维进行排序,只需要将轴编号传给sort即可
arr = np.random.randn(4,3)
arr
Out[28]:
array([[ 1.65426166, 0.72345798, 0.54172487],
[ 0.42299115, 0.26661342, 0.44222104],
[ 0.62432732, 0.6765546 , -0.95483994],
[ 1.25453269, -0.15451337, -0.31239763]])
arr.sort(1)
arr
Out[30]:
array([[ 0.54172487, 0.72345798, 1.65426166],
[ 0.26661342, 0.42299115, 0.44222104],
[-0.95483994, 0.62432732, 0.6765546 ],
[-0.31239763, -0.15451337, 1.25453269]])
9.数组的集合运算
unique(x) 计算x中的唯一元素,并返回有序结果
intersect1d(x,y) 计算x和y中的公共元素,并返回有序结果
union1d(x,y) 计算x和y的并集,并返回有序的结果
ints = np.array([1,1,1,2,3,4,4,3])
np.unique(ints)
Out[32]: array([1, 2, 3, 4])
10.线性代数
常用的numpy.linalg 函数、
diag 对角线元素
dot 矩阵乘法
trace 计算对角线元素的和
det 计算行列式
eig 方阵的特征值和特征向量
inv 方阵的逆
qr QR分解
svd 奇异值分解
lstsq 计算Ax=b 的最小二乘解