Python 数据分析之Numpy

Python有着大量功能强大的第三方库。这些第三方库可以大大地扩充Python的功能,我们在实际使用中往往也离不开这些第三方库。

NumPy是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多。NumPy(Numeric Python)提供了许多高级的数值编程工具。Numpy的一个重要特性是它的数组计算,是我们做数据分析必不可少的一个包。

导入python库使用关键字import,后面可以自定义库的简称,但是一般都将Numpy命名为np,pandas命名为pd。

使用前一定要先导入Numpy包,导入的方法有以下几种:

import numpy
import numpy as np
from numpy import *

1. Numpy 的数组对象及其索引

假设我们想将列表中的每个元素增加1,但列表不支持这样的操作:

a = [1,2,3,4]

列表中的每个元素增加1的正确写法:

a = [1,2,3,4]
[x+1 for x in a]
输出
[1, 2, 3, 4, 2, 3, 4, 5]

[x+y for(x,y) in zip(a,b)]
输出
array([1, 2, 3, 4])

每个元素增加1

a+1
输出
array([2, 4, 6, 8])

a和b相加

a = np.array([1,2,3,4])
b = np.array([2,3,4,5])
a + b
输出
array([0, 1, 2, 3])
a = np.array([1,2,3,4])
a
输出
array([0., 0., 0., 0., 0.])
np.ones(5)
输出
array([ True,  True,  True,  True,  True])
np.ones(5,dtype="int")
输出
array([1, 2, 3, 4])
a.fill(5)
a
输出
array([2, 2, 2, 2])

强制类型转换

a = np.array([1,2,3,4])
a = a.astype("float")
a.fill(2.5)
a
输出
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
a = np.arange(1,10)
a
输出
array([ 1.  ,  1.45,  1.9 ,  2.35,  2.8 ,  3.25,  3.7 ,  4.15,  4.6 ,
        5.05,  5.5 ,  5.95,  6.4 ,  6.85,  7.3 ,  7.75,  8.2 ,  8.65,
        9.1 ,  9.55, 10.  ])
np.random.rand(10)
输出
array([ 1.05865726,  0.34513619,  0.35855723, -0.06145859,  0.04337155,
        0.70850382, -1.29324883, -1.90938997, -2.53480652,  2.44232185])

生成随机整数,从1-20中随机10个

np.random.randint(1,20,10)
输出
array([ 1.  ,  1.45,  1.9 ,  2.35,  2.8 ,  3.25,  3.7 ,  4.15,  4.6 ,
        5.05,  5.5 ,  5.95,  6.4 ,  6.85,  7.3 ,  7.75,  8.2 ,  8.65,
        9.1 ,  9.55, 10.  ])
type(a)
输出
dtype('float64')

会返回一个元组,每个元素代表这一维的元素数目

a.shape
输出
(21,)
a.size
输出
1

和列表相似,数组也支持索引和切片操作

a = np.array([0,1,2,3])
a[0]
输出
array([10,  1,  2,  3])
a[1:-2]
输出
array([12, 13])
a[::2]
输出
array([21000, 21800, 22240, 23450, 25000])

可以这样计算每天的票房


ob2 = ob[1:]-ob[:-1]
ob2
输出
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13]])

事实上我们传入的是一个以列表为元素的列表,最终得到一个二维数组

a.shape
输出
8
a.ndim
输出
13

其中,1是行索引,3是列索引,中间用逗号隔开。事实上,Python会将它们看成一个元组(1,3),然后按照顺序进行对应。

可以利用索引给它赋值

a[1,3] = -1
a
输出
array([10, 11, 12, -1])

Python会将这单个元组当成对第一维的索引,然后返回对应列的内容

a[:,1]
输出
array([[ 0,  1,  2,  3,  4,  5],
       [10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25],
       [30, 31, 32, 33, 34, 35],
       [40, 41, 42, 43, 44, 45],
       [50, 51, 52, 53, 54, 55]])

得到第一行的第4和第5两个元素

a[ a : b , c : d ]
逗号前为行,逗号后为列
a : b 为 a到b;c : d 为 c到d

a[0,3:5]
输出
array([[44, 45],
       [54, 55]])

得到第三列

a[:,2]
输出
array([[ 2],
       [12],
       [22],
       [32],
       [42],
       [52]])

每一维都支持切片的规则,包括负索引,省略

[lower:upper:step]

例如,取出3,5行的奇数列

a[2::2,::2]

输出
[2 3]
b[0] = 10
a
输出
[1, 2, 3, 4, 5]

引用机制的好处:这样做的好处在于,对于很大的数组,不用大量复制多余的值,节约了空间。
引用机制的缺点:可能出现改变一个值改变另一个值的情况
一个解决方法是使用copy()方法产生一个复制,这个复制会申请新的内存

a = np.array([0,1,2,3,4])
b = a[2:4].copy()
b[0] = 10
a
输出
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])

花式索引需要指定索引位置

index = [1,2,-3]
y = a[index]
print(y)
输出
array([False,  True,  True, False, False,  True, False, False,  True,
       False])

mask必须是布尔数组,长度必须和数组长度相等

a[mask]
输出
array([[ 0,  1,  2,  3,  4,  5],
       [10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25],
       [30, 31, 32, 33, 34, 35],
       [40, 41, 42, 43, 44, 45],
       [50, 51, 52, 53, 54, 55]])

返回的是一条次对角线上的5个值

a[(0,1,2,3,4),(1,2,3,4,5)]
输出
array([[30, 32, 34],
       [40, 42, 44],
       [50, 52, 54]])

也可以使用mask进行索引

mask = np.array([1,0,1,0,0,1],dtype = bool)
a[mask,2]
输出
array([[ 0,  1,  2,  3,  4,  5],
       [10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25]])

这时候也可以使用花式索引取出第2,3,5行

con = np.array([0,1,1,0,1,0],dtype = bool)
a[con]
输出
array([False,  True, False,  True])

数组中所有大于10的元素的索引位置

np.where(a>10)
输出
array([12, 20])
a[np.where(a>10)]
输出
array([ 1.5, -3. ])
a = np.array([1,2,3])
np.asarray(a,dtype = float)
输出
array([1., 2., 3.])
a
输出
array([1., 2., 3.])

3. 数组操作

我们以豆瓣10部高分电影为例


mv_name = ["肖申克的救赎","控方证人","美丽人生","阿甘正传","霸王别姬","泰坦尼克号","辛德勒的名单","这个杀手不太冷","疯狂动物城","海豚湾"]

mv_num = np.array([692795,42995,327855,580897,478523,157074,306904,662552,284652,159302])

mv_score = np.array([9.6,9.5,9.5,9.4,9.4,9.4,9.4,9.3,9.3,9.3])

mv_length = np.array([142,116,116,142,171,194,195,133,109,92])

电影评分人数mv_num从小到大排序

np.sort(mv_num)
输出
array([692795,  42995, 327855, 580897, 478523, 157074, 306904, 662552,
       284652, 159302])

argsort 返回从小到大的排列在数组中的索引位置

order = np.argsort(mv_num)
order
输出
'控方证人'
mv_name[order[-1]]
输出
3693549
mv_num.sum()
输出
195
mv_length.max()
输出
9.3
mv_score.min()
输出
141.0
mv_length.mean()
输出
33.713498780162226
mv_length.std()
输出
array([[9.88888889e-03, 4.55555556e-01],
       [4.55555556e-01, 1.26288889e+03]])

4. 多维数组操作

a = np.arange(6)
a
输出
array([[0, 1, 2],
       [3, 4, 5]])
a.shape
输出
array([0, 1, 2, 3, 4, 5])
a.reshape(2,3)
输出
array([0, 1, 2, 3, 4, 5])
a = a.reshape(2,3)
a
输出
array([[0, 3],
       [1, 4],
       [2, 5]])
a.transpose()
输出
array([[0, 1, 2],
       [3, 4, 5]])

有时候我们需要将不同的数组按照一定的顺序连接起来:
concatenate((a0,a1,…,aN),axis = 0)

注意,这些数组要用()包括到一个元组中去。
除了给定的轴外,这些数组其他轴的长度必须是一样的。

x = np.array([[0,1,2],[10,11,12]])
y = np.array([[50,51,52],[60,61,62]])
print(x.shape)
print(y.shape)
输出
array([[ 0,  1,  2],
       [10, 11, 12],
       [50, 51, 52],
       [60, 61, 62]])

沿着第二维进行连接

z = np.concatenate((x,y),axis = 1)
z
输出
array([[[ 0,  1,  2],
        [10, 11, 12]],

       [[50, 51, 52],
        [60, 61, 62]]])

事实上,Numpy提供了分别对应这三种情况的函数:

  • vstack 沿着第一维进行连接
  • hstack 沿着第二维进行连接
  • dstack 沿着第三维进行连接
np.vstack((x,y))
输出
array([[ 0,  1,  2, 50, 51, 52],
       [10, 11, 12, 60, 61, 62]])
np.dstack((x,y))
输出
array([1, 2, 3, 2])
np.exp(a)
输出
0.5

`python
np.cumsum(a)

Original: https://blog.csdn.net/weixin_49915090/article/details/127777461
Author: foursecond
Title: Python 数据分析之Numpy

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/759669/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球