接上一篇
In [1]:
%matplotlib inline
In [2]:
from numpy.random import randn
import numpy as np
np.set_printoptions(precision=4, suppress=True) # 设置屏幕输出的格式,精度,小数点后保留的位数
2.数组的元素级通用函数
numpy提供的通用函数,可以直接对数组的每个元素进行计算处理,不用循环。使用方法也很简单:
import numpy as np
np.函数名(数组1, 数组2, ...)
常用的一元函数,即只对一个数组进行运算的函数:
类型 | 说明 |
---|---|
abs、fabs | 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs |
sqrt | 计算各元素的平方根。相当于arr**0.5 |
square | 计算各元素的平方。相当于arr**2 |
exp | 计算各元素的指数ex |
log、Iog10、log2、loglp | 分别为自然对数(底数为e)、底数为10的log、底数为2的log、log(1+X) |
sign | 计算各元素的正负号:1(正数)、0(零)、一1(负数) |
ceil | 计算各元素的“天花板”值,即大于等于所有元素的最小整数 |
floor | 计算各元素的“地板”值,即小于等于所有元素的最大整数 |
rint | 将各元素值四舍五入到最接近的整数,保留dtype |
modf | 将数组的小数和整数部分以两个独立数组的形式返回 |
isnan | 返回一个表示“哪些值是NaN(这不是一个数字)”的布尔型数组 |
isfinite、isinf | 分别返回一个表示“哪些元素是有穷的(非inf,非NaN)”或“哪些元素是无穷的”的布尔型数组 |
cos,cosh,sin,sinh,tan,tanh | 普通型和双曲型三角函数 |
常用的二元函数,即对两个以上的数组进行运算的函数:
类型 | 说明 |
---|---|
add | 将数组中对应的元素相加 |
subtract | 从第一个数组中减去第二个数组中的元素 |
multiply | 数组元素相乘 |
divide、floor_divide | 除法或向下圆整除法(丢弃余数) |
power | 对第一个数组中的元素A,根据第二个数组中的相应元素B,计算A的B次方 |
maximum、fmax | 对应元素级的最大值计算。fmax将忽略NaN空值 |
minimum、fmin | 对应元素级的最小值计算。fmin将忽略NaN空值 |
mod | 元素级的求模计算(除法的余数) |
In [3]:
arr = np.arange(10)
arr
Out[3]:
In [4]:
np.sqrt(arr)
Out[4]:
In [5]:
np.exp(arr)
Out[5]:
In [6]:
arr1 = randn(8)
arr2 = randn(8)
print(arr1)
print(arr2)
In [7]:
np.maximum(arr1, arr2) # 参数包括两个数组,取两个数组对应的元素中更大的那个。
Out[7]:
In [8]:
arr = randn(7) * 5
print(arr)
np.modf(arr) # 返回两个数组,分别是 源数组各个元素的整数和小数部分
Out[8]:
3. 使用数组进行数据处理
3.1 数学统计方法
求数组的均值和求和。可以用python内置的函数,也可以用NumPy提供的API。
In [9]:
arr = np.random.randn(5, 4) # normally-distributed data
arr
Out[9]:
In [10]:
arr.mean()
Out[10]:
In [11]:
np.mean(arr)
Out[11]:
In [12]:
arr.sum()
Out[12]:
In [13]:
np.sum(arr)
Out[13]:
对于二维以上的数组,可以按某个轴向进行数学统计计算。
In [14]:
arr.mean(axis=1) # 对于二维数组,axis=0表示按列求均值,axis=1表示按行求均值
Out[14]:
In [15]:
arr.mean(1) # 也可以不显式地指定axis,直接用一个整数表示按某个轴进行计算
Out[15]:
In [16]:
arr[0].mean()
Out[16]:
In [17]:
arr.sum(axis=0) # 对于二维数组,axis=0表示按列求均值,axis=1表示按行求均值
Out[17]:
In [18]:
arr.sum(0) # 也可以不显式地指定axis,直接用一个整数表示按某个轴进行计算
Out[18]:
In [19]:
arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
arr
Out[19]:
In [20]:
arr.cumsum(axis=0) # 按列累计求和
Out[20]:
In [21]:
arr.cumprod(1) # 按行累计求积
Out[21]:
3.2 布尔型数组的方法
In [22]:
arr = randn(10)
arr
Out[22]:
In [23]:
(arr > 0).sum() # arr中正数有多少个
Out[23]:
In [24]:
bools = np.array([False, False, True, False])
bools.any() #布尔数组中是否存在一个或多个True
Out[24]:
In [25]:
bools.all() # 布尔数组中是否全都是 True
Out[25]:
any()和all()方法用于非布尔型数组时,所有非零的元素都被当作True,零元素是False
3.3 排序
In [26]:
arr = randn(10)
arr
Out[26]:
数组调用sort方法排序后,会把原数组修改为排序后的样子。
In [27]:
arr.sort()
arr
Out[27]:
使用NumPy的sort方法,产生的是一个排序后的副本,没有对原数组进行修改。这与前面的方法完全不同,可以应用在不同的场合,要特别注意。
In [28]:
arr1 = randn(8)
arr1
Out[28]:
In [29]:
np.sort(arr1) #产生了一个排序后的视图,没有修改原数组arr1
Out[29]:
In [30]:
arr1
Out[30]:
对于二维数组,也可以像前面类似的,针对某个轴向进行排序
In [31]:
arr2d = randn(5, 3)
arr2d
Out[31]:
In [32]:
arr2d.sort(1) #所有的行都重新排序了
arr2d
Out[32]:
3.4 将条件运算转化为数组运算
在Python基础中,我们学习过三元表达式: value1 if condition else value2,把一个条件判断结构转化为一个语句。在NumPy中,有一个where()方法,把条件运算,转化为一个数组运算
以下例子:xarr、yarr、cond三个数组的元素是有对应关系的,要求根据cond中的布尔值,选择对应的xarr和yarr中的元素。当cond的元素为True时,选xarr的对应元素,否则选yarr中的对应元素
In [33]:
arr1 = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
arr2 = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
cond = np.array([True, False, True, True, False])
In [34]:
result = np.where(cond, arr1, arr2)
result
Out[34]:
where()方法中第二个和第三个参数,可以不是数组,而是标量数值
In [35]:
arr = randn(4, 4)
arr
Out[35]:
In [36]:
np.where(arr > 0, 2, -2)
Out[36]:
In [37]:
np.where(arr > 0, 2, arr) # 把大于零的元素都修改为2
Out[37]:
4. 线性代数
单位矩阵
In [38]:
np.eye(4)
Out[38]:
矩阵的乘法(点积)
In [39]:
x = np.array([[1., 2., 3.], [4., 5., 6.]])
x
Out[39]:
In [40]:
y = np.array([[6., 23.], [-1, 7], [8, 9]])
y
Out[40]:
In [41]:
x.dot(y) # 相当于 np.dot(x, y)
Out[41]:
In [42]:
np.dot(x, np.ones(3)) # 相当于 x.dot(ones(3))
Out[42]:
矩阵的转置
In [43]:
x.T
Out[43]:
求逆矩阵
In [44]:
z = np.array([[1, 2],[4, 5]])
z
Out[44]:
In [45]:
z1 = np.linalg.inv(z)
z1
Out[45]:
In [46]:
np.dot(z, z1)
Out[46]: