Python之numpy基础(2)

接上一篇
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]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [4]:
np.sqrt(arr)
Out[4]:
array([ 0.    ,  1.    ,  1.4142,  1.7321,  2.    ,  2.2361,  2.4495,
        2.6458,  2.8284,  3.    ])
In [5]:
np.exp(arr)
Out[5]:
array([    1.    ,     2.7183,     7.3891,    20.0855,    54.5982,
         148.4132,   403.4288,  1096.6332,  2980.958 ,  8103.0839])
In [6]:
arr1 = randn(8)
arr2 = randn(8)
print(arr1)
print(arr2)
[-1.2293  0.0212 -0.8117  1.2745  0.4722 -0.7776 -0.4024  1.4221]
[ 2.5314  0.5932  1.6429 -0.0449  1.6943  0.2826 -0.3265 -0.4137]
In [7]:
np.maximum(arr1, arr2) # 参数包括两个数组,取两个数组对应的元素中更大的那个。
Out[7]:
array([ 2.5314,  0.5932,  1.6429,  1.2745,  1.6943,  0.2826, -0.3265,
        1.4221])
In [8]:
arr = randn(7) * 5
print(arr)
np.modf(arr)  # 返回两个数组,分别是 源数组各个元素的整数和小数部分
[ 2.2857  0.0002 -1.1849  5.2699 -3.3938 -4.3882 -1.1335]
Out[8]:
(array([ 0.2857,  0.0002, -0.1849,  0.2699, -0.3938, -0.3882, -0.1335]),
 array([ 2.,  0., -1.,  5., -3., -4., -1.]))

3. 使用数组进行数据处理

3.1 数学统计方法

求数组的均值和求和。可以用python内置的函数,也可以用NumPy提供的API。

In [9]:
arr = np.random.randn(5, 4) # normally-distributed data
arr
Out[9]:
array([[ 0.4117, -0.7198, -0.0559,  2.1091],
       [-0.5251, -0.8729,  0.1598,  0.8862],
       [ 0.5474, -0.2348,  1.7678,  0.4127],
       [-0.9241, -2.5377, -1.2032, -0.0319],
       [ 1.1934,  1.0515, -0.2795,  0.7104]])
In [10]:
arr.mean()
Out[10]:
0.093259614446683944
In [11]:
np.mean(arr)
Out[11]:
0.093259614446683944
In [12]:
arr.sum()
Out[12]:
1.8651922889336789
In [13]:
np.sum(arr)
Out[13]:
1.8651922889336789

对于二维以上的数组,可以按某个轴向进行数学统计计算。

In [14]:
arr.mean(axis=1)  # 对于二维数组,axis=0表示按列求均值,axis=1表示按行求均值
Out[14]:
array([ 0.4363, -0.088 ,  0.6233, -1.1742,  0.6689])
In [15]:
arr.mean(1)  # 也可以不显式地指定axis,直接用一个整数表示按某个轴进行计算
Out[15]:
array([ 0.4363, -0.088 ,  0.6233, -1.1742,  0.6689])
In [16]:
arr[0].mean()
Out[16]:
0.43628428018819054
In [17]:
arr.sum(axis=0) # 对于二维数组,axis=0表示按列求均值,axis=1表示按行求均值
Out[17]:
array([ 0.7034, -3.3137,  0.389 ,  4.0865])
In [18]:
arr.sum(0)   # 也可以不显式地指定axis,直接用一个整数表示按某个轴进行计算
Out[18]:
array([ 0.7034, -3.3137,  0.389 ,  4.0865])
In [19]:
arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
arr
Out[19]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
In [20]:
arr.cumsum(axis=0)  # 按列累计求和
Out[20]:
array([[ 0,  1,  2],
       [ 3,  5,  7],
       [ 9, 12, 15]], dtype=int32)
In [21]:
arr.cumprod(1) # 按行累计求积
Out[21]:
array([[  0,   0,   0],
       [  3,  12,  60],
       [  6,  42, 336]], dtype=int32)

3.2 布尔型数组的方法

In [22]:
arr = randn(10)
arr
Out[22]:
array([ 0.6351, -0.7123,  0.5458, -0.3191,  0.5699, -0.0121,  0.2982,
        0.5207, -0.8048, -0.1662])
In [23]:
(arr > 0).sum() # arr中正数有多少个
Out[23]:
5
In [24]:
bools = np.array([False, False, True, False])
bools.any()   #布尔数组中是否存在一个或多个True
Out[24]:
True
In [25]:
bools.all()  # 布尔数组中是否全都是 True
Out[25]:
False

any()和all()方法用于非布尔型数组时,所有非零的元素都被当作True,零元素是False

3.3 排序

In [26]:
arr = randn(10)
arr
Out[26]:
array([-0.1207,  1.2646, -0.5324,  0.7981, -0.7842, -0.9467,  0.5223,
        0.2064,  0.7084, -0.5149])

数组调用sort方法排序后,会把原数组修改为排序后的样子。

In [27]:
arr.sort()
arr
Out[27]:
array([-0.9467, -0.7842, -0.5324, -0.5149, -0.1207,  0.2064,  0.5223,
        0.7084,  0.7981,  1.2646])

使用NumPy的sort方法,产生的是一个排序后的副本,没有对原数组进行修改。这与前面的方法完全不同,可以应用在不同的场合,要特别注意。

In [28]:
arr1 = randn(8)
arr1
Out[28]:
array([-0.2215, -0.3881, -0.9451,  0.1135, -0.9249, -1.1373,  2.3239,
       -1.2957])
In [29]:
np.sort(arr1)  #产生了一个排序后的视图,没有修改原数组arr1
Out[29]:
array([-1.2957, -1.1373, -0.9451, -0.9249, -0.3881, -0.2215,  0.1135,
        2.3239])
In [30]:
arr1
Out[30]:
array([-0.2215, -0.3881, -0.9451,  0.1135, -0.9249, -1.1373,  2.3239,
       -1.2957])

对于二维数组,也可以像前面类似的,针对某个轴向进行排序

In [31]:
arr2d = randn(5, 3)
arr2d
Out[31]:
array([[-2.2712,  0.2291, -0.3672],
       [-0.0784,  0.0319,  0.581 ],
       [-1.0709,  1.6831,  1.0992],
       [-1.6751, -0.8478,  1.4083],
       [ 0.7878, -0.2051,  0.6532]])
In [32]:
arr2d.sort(1) #所有的行都重新排序了
arr2d
Out[32]:
array([[-2.2712, -0.3672,  0.2291],
       [-0.0784,  0.0319,  0.581 ],
       [-1.0709,  1.0992,  1.6831],
       [-1.6751, -0.8478,  1.4083],
       [-0.2051,  0.6532,  0.7878]])

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]:
array([ 1.1,  2.2,  1.3,  1.4,  2.5])

where()方法中第二个和第三个参数,可以不是数组,而是标量数值

In [35]:
arr = randn(4, 4)
arr
Out[35]:
array([[ 1.6763, -0.1034, -0.5132, -1.002 ],
       [ 1.9216, -0.3967,  0.3509,  0.9485],
       [ 0.9406,  1.2939, -1.0362,  1.9473],
       [-0.8312, -1.5387, -0.262 ,  0.3067]])
In [36]:
np.where(arr > 0, 2, -2)
Out[36]:
array([[ 2, -2, -2, -2],
       [ 2, -2,  2,  2],
       [ 2,  2, -2,  2],
       [-2, -2, -2,  2]])
In [37]:
np.where(arr > 0, 2, arr) # 把大于零的元素都修改为2
Out[37]:
array([[ 2.    , -0.1034, -0.5132, -1.002 ],
       [ 2.    , -0.3967,  2.    ,  2.    ],
       [ 2.    ,  2.    , -1.0362,  2.    ],
       [-0.8312, -1.5387, -0.262 ,  2.    ]])

4. 线性代数

单位矩阵

In [38]:
np.eye(4)
Out[38]:
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])

矩阵的乘法(点积)

In [39]:
x = np.array([[1., 2., 3.], [4., 5., 6.]])
x
Out[39]:
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])
In [40]:
y = np.array([[6., 23.], [-1, 7], [8, 9]])
y
Out[40]:
array([[  6.,  23.],
       [ -1.,   7.],
       [  8.,   9.]])
In [41]:
x.dot(y)  # 相当于 np.dot(x, y)
Out[41]:
array([[  28.,   64.],
       [  67.,  181.]])
In [42]:
np.dot(x, np.ones(3))  # 相当于 x.dot(ones(3))
Out[42]:
array([  6.,  15.])

矩阵的转置

In [43]:
x.T
Out[43]:
array([[ 1.,  4.],
       [ 2.,  5.],
       [ 3.,  6.]])

求逆矩阵

In [44]:
z = np.array([[1, 2],[4, 5]])
z
Out[44]:
array([[1, 2],
       [4, 5]])
In [45]:
z1 = np.linalg.inv(z)
z1
Out[45]:
array([[-1.6667,  0.6667],
       [ 1.3333, -0.3333]])
In [46]:
np.dot(z, z1)
Out[46]:
array([[ 1.,  0.],
       [ 0.,  1.]])
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值