科学计算工具Numpy

numpy简介

Numpy:提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库。用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多。本身是由C语言开发,是个很基础的扩展Python其余的科学计算扩展大部分都是以此为基础。高性能科学计算和数据分析的基础包。ndarray,多维数组(矩阵),具有矢量运算能力,快速、节省空间。矩阵运算,无需循环,可完成类似Matlab中的矢量运算线性代数、随机数生成。

1.NumPy数组的创建

numpy数组是一个多维的数组对象(矩阵),称为ndarray,具有矢量算术运算能力,并具有执行速度快和节省空间的特点。
注意:ndarray的下标从0开始,且数组里的所有元素必须是相同类型
ndarray属性
1.ndim属性:维度个数
2.shape属性:维度大小
3.dtype属性:数据类型

使用numpy生成简单的随机数[0,1)

# 当rand只有一个参数,表示生成的一维数组,参数表示数组的个数
>>> np.random.rand(1)
array([0.89203184])
>>> np.random.rand(2)
array([0.85662727, 0.64824804])
>>> np.random.rand(3)
array([0.77511044, 0.46904238, 0.00780967])

生成指定维数的数据,第一个参数表示第一维度中数组的个数,第二个参数表示第二维度数组的个数

# 导入numpy
import numpy as np 
# 生成指定维度大小(3行4列)的随机多维浮点型数据(二维),rand固定区间0.0 ~ 1.0 
>>> np.random.rand(3, 4)
array([[0.29215402, 0.68543925, 0.48303073, 0.00827797],
       [0.98862213, 0.33065791, 0.3290673 , 0.18390224],
       [0.49983908, 0.54521461, 0.73658653, 0.71214083]])
>>> np.random.rand(4, 3)
array([[0.85669123, 0.77398681, 0.43951684],
       [0.37571215, 0.68408431, 0.93869697],
       [0.27642824, 0.68777992, 0.27738744],
       [0.47675432, 0.42990546, 0.21045483]])
2.ndarray数组创建
2-1.np.random. uniform()方法使用

生成指定维度大小(3行4列)的随机多维浮点型数据(二维),uniform()可以指定区间(-1, 5) ,arr = np.random.uniform(-1, 5, size = (3, 4)) 'size='可省略

# 这里uniform前两个参数表示规定的范围,size表示二维数组维度大小。
>>> np.random.uniform(-1,5,size=(3,4))
array([[ 3.85536452,  1.61365369,  1.16079153,  1.89497298],
       [ 2.37728985,  2.35285825,  0.7788691 , -0.88447367],
       [ 2.44396506,  2.44074519,  4.95173011, -0.13254573]])
>>> arr=np.random.uniform(-1,5,size=(2,4))
>>>print(arr)
array([[ 3.3124339 ,  2.00718046, -0.18609511,  1.47210391],
       [-0.17790801,  3.15517112,  0.523737  ,  3.88743682]])
>>> print('维度个数: ', arr.ndim)
维度个数:  2
>>> print('维度大小: ', arr.shape)
维度大小:  (2, 4)
>>> print('数据类型: ', arr.dtype)
数据类型:  float64
2-2 指定大小的全0数组

指定大小的全0数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。

# 例如:
>>> np.zeros((3, 4))
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
2-3.指定大小的全1数组

指定大小的全1数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。

例如:
>>> np.ones((2, 3))
array([[1., 1., 1.],
       [1., 1., 1.]])
2-4.初始化数组,不是总是返回全0,有时返回的是未初始的随机值(内存里的随机值)。
# 初始化数组
>>> np.empty((3, 3))
array([[1.12677977e-311, 7.28765190e-314, 9.21664466e-315],
       [2.96439388e-323, 2.00196267e-313, 1.12889094e-311],
       [1.12677977e-311, 3.39411166e-313, 2.61392709e+180]])
# 初始化数组的同时,指定数据类型
>>> np.empty((3, 3), int)
array([[ -21048624,        531,  -21048568],
       [       531,  -21075728,        531],
       [ -21051408,        531, 1865310496]])
2-5. np.arange() 和 reshape()

arange() 类似 python 的 range() ,创建一个一维 ndarray 数组。reshape() 将 重新调整数组的维数。

# np.arange(),类似域python3中的range()
>>> np1=np.arange(10)
>>> np1
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np2=np.arange(5)
>>> np2
array([0, 1, 2, 3, 4])
#reshape()可以重新调整数组的维数,不过维度和维数要符合原来数组的个数
>>> np1.reshape(2,5)
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
# 假如np1为元素为10个数的数组,则只能重新调整为2维度且每个维度有5个元素,或者相反,其他的则无法转换。
>>> np1.reshape(3,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: cannot reshape array of size 10 into shape (3,3)
>>>
2-6.Ndarray数据类型
2-6-1. dtype参数

指定数组的数据类型,类型名+位数,如float64, int32

#范例: 初始化3行4列数组,数据类型为float64 
>>> zeros_float_arr = np.zeros((3, 4), dtype=np.float64)
>>> print(zeros_float_arr)
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
>>> print(zeros_float_arr.dtype)
float64
2-6-2.astype方法

转换数组的数据类型

# 将上个例子中的float类型的数组转换为int32
>>> zeros_int_arr = zeros_float_arr.astype(np.int32)
>>> print(zeros_int_arr)
[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]
>>> print(zeros_int_arr.dtype)
int32
2-7.ndarray的矩阵运算

数组是编程中的概念,矩阵、矢量是数学概念。在计算机编程中,矩阵可以用数组形式定义,矢量可以用结构定义!

2-7-1. 矢量运算:相同大小的数组间运算应用在元素上
# 示例:矢量与矢量运算 
arr = np.array([[1, 2, 3], [4, 5, 6]]) 
>>> print("元素相乘:%s"%(arr*arr))
元素相乘:[[ 1  4  9]
 [16 25 36]]
>>> print("矩阵相加:%s"%(arr+arr))
矩阵相加:[[ 2  4  6]
 [ 8 10 12]]
2-7-2. 矢量和标量运算:

"广播" - 将标量"广播"到各个元素

示例:
# 矢量与标量运算 
>>> arr = np.array([[1, 2, 3], [4, 5, 6]])
>>> print(1. / arr)
[[1.         0.5        0.33333333]
 [0.25       0.2        0.16666667]]
>>> print(2. * arr)
[[ 2.  4.  6.]
 [ 8. 10. 12.]]
2-7-3.ndarray的索引与切片

①. 一维数组的索引与切片与Python的列表索引功能相似

示例:
# 一维数组 
>>> arr1 = np.arange(10)
>>> print(arr1)
[0 1 2 3 4 5 6 7 8 9]
>>> print(arr1[2:5])
[2 3 4]

②多维数组的索引与切片
arr[r1:r2, c1:c2],第一个r1:r2表示行,r1闭区间,r2为开区间(取不到),c1:c2表示列。
arr[1,1] 等价 arr[1][1]
[:] 代表某个维度的数据

示例:
# 多维数组 
>>> arr2 = np.arange(12).reshape(3,4)
>>> print(arr2)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
>>> print(arr2[1])
[4 5 6 7]
>>> print(arr2[0:2, 2:])
[[2 3]
 [6 7]]
>>> print(arr2[:, 1:3])
[[ 1  2]
 [ 5  6]
 [ 9 10]]

③. 条件索引
布尔值多维数组:arr[condition],condition也可以是多个条件组合。
注意,多个条件组合要使用 & | 连接,而不是Python的 and or。

示例:
# 条件索引 找出 data_arr 中 2005年后的数据 
>>> data_arr = np.random.rand(3,3)
>>> print(data_arr)
[[0.27683791 0.79372477 0.22811993]
 [0.10034831 0.57155537 0.70364493]
 [0.68260789 0.80560241 0.86759406]]
>>> year_arr = np.array([[2000, 2001, 2000], [2005, 2002, 2009], [2001, 2003, 2010]])
>>> is_year_after_2005 = year_arr >= 2005
>>> print(is_year_after_2005,is_year_after_2005.dtype)
[[False False False]
 [ True False  True]
 [False False  True]] bool
>>>
>>> filtered_arr = data_arr[is_year_after_2005]
>>> print(filtered_arr)
[0.10034831 0.70364493 0.86759406]
>>> filtered_arr = data_arr[(year_arr <= 2005) & (year_arr % 2 == 0)]
>>> print(filtered_arr)
[0.27683791 0.22811993 0.57155537]
2-8.ndarray的转置

二维数组直接使用转换函数:transpose()
高维数组转换要指定维度编号参数 (0, 1, 2, …),注意参数是元组

示例代码:
>>> arr = np.random.rand(2,3) # 2x3 数组 
>>> print(arr)
[[0.77952339 0.84146401 0.44259318]
 [0.95848793 0.18365564 0.78185754]]
>>> print(arr.transpose())   # 转换为 3x2 数组 
[[0.77952339 0.95848793]
 [0.84146401 0.18365564]
 [0.44259318 0.78185754]]
>>> arr3d = np.random.rand(2,3,4)  2x3x4 数组,2对应0,3对应1,4对应2 
>>> print(arr3d)
[[[0.68059153 0.27698074 0.2297675  0.26879757]
  [0.63490932 0.28204753 0.74448196 0.9033109 ]
  [0.83402649 0.3721069  0.00605961 0.15624495]]

 [[0.2279527  0.62085447 0.54684165 0.37898785]
  [0.45453372 0.22428724 0.71416554 0.14174275]
  [0.37052589 0.98551022 0.62010239 0.23599093]]]
>>> print(arr3d.transpose((1,0,2)))  # 根据维度编号,转为为 3x2x4 数组
[[[0.68059153 0.27698074 0.2297675  0.26879757]
  [0.2279527  0.62085447 0.54684165 0.37898785]]

 [[0.63490932 0.28204753 0.74448196 0.9033109 ]
  [0.45453372 0.22428724 0.71416554 0.14174275]]

 [[0.83402649 0.3721069  0.00605961 0.15624495]
  [0.37052589 0.98551022 0.62010239 0.23599093]]]
3.元素计算函数

ceil(): 向上最接近的整数,参数是 number 或 array
floor(): 向下最接近的整数,参数是 number 或 array
rint(): 四舍五入,参数是 number 或 array
isnan(): 判断元素是否为 NaN(Not a Number),参数是 number 或 array
multiply(): 元素相乘,参数是 number 或 array
divide(): 元素相除,参数是 number 或 array
abs():元素的绝对值,参数是 number 或 array
where(condition, x, y): 三元运算符,x if condition else y

示例:
# randn() 返回具有标准正态分布的序列。
>>> arr = np.random.randn(2,3)
>>> print(arr)
[[ 0.28346419  0.20901299 -0.23067226]
 [-1.23499234  0.7704801   1.28326615]]
>>> print(np.ceil(arr))   # 向上取整
[[ 1.  1. -0.]
 [-1.  1.  2.]]
>>> print(np.floor(arr))   # 向下取整
[[ 0.  0. -1.]
 [-2.  0.  1.]]
>>> print(np.rint(arr))    #  四舍五入
[[ 0.  0. -0.]
 [-1.  1.  1.]]
>>> print(np.isnan(arr))  # 是否是非数字
[[False False False]
 [False False False]]
>>> print(np.multiply(arr, arr))   # 相乘
[[0.08035194 0.04368643 0.05320969]
 [1.52520608 0.59363959 1.64677201]]
>>> print(np.divide(arr, arr))  # 相乘
[[1. 1. 1.]
 [1. 1. 1.]]
>>> print(np.where(arr > 0, 1, -1))   # 三元运算
[[ 1  1 -1]
 [-1  1  1]]
4.元素统计函数

np.mean(), np.sum():所有元素的平均值,所有元素的和,参数是 number 或 array
np.max(), np.min():所有元素的最大值,所有元素的最小值,参数是 number 或 array
np.std(), np.var():所有元素的标准差,所有元素的方差,参数是 number 或 array
np.argmax(), np.argmin():最大值的下标索引值,最小值的下标索引值,参数是 number 或 array
np.cumsum(), np.cumprod():返回一个一维数组,每个元素都是之前所有元素的 累加和 和 累乘积,参数是 number 或 array
多维数组默认统计全部维度,axis参数可以按指定轴心统计,值为0则按列统计,值为1则按行统计。

>>> arr = np.arange(12).reshape(3,4)
>>> print(arr)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
>>> print(np.sum(arr)) # 所有元素的和
66
>>> print(np.sum(arr, axis=0)) # 数组的按列统计和
[12 15 18 21]
>>> print(np.sum(arr, axis=1)) # 数组的按行统计和
[ 6 22 38]
>>> print(np.cumsum(arr)) # 返回一个一维数组,每个元素都是之前所有元素的 累加和
[ 0  1  3  6 10 15 21 28 36 45 55 66]
>>> arr = np.random.randint(0,10,(3,4))
>>> print(arr)
[[1 5 9 7]
 [6 0 0 8]
 [9 3 5 1]]
>>> print(np.mean(arr))   # 求所有元素的平均值
4.5
>>> print(np.sum(arr))    # 所有元素的和
54
>>> print(np.max(arr))   # 最大元素的值
9
>>> print(np.min(arr))    # 最小元素的值
0 
#方差和标准差:衡量数据和期望值之间的偏离值
#求方差:所有元素都和平均数的差的平方的平均数
>>> print(np.var(arr))
10.75
#求标准差:方差的平方根
>>> print(np.std(arr))
3.278719262151
#求最大值和最小值的索引下标
#如果是多维数组,将多维数组合并成一维数组,再找出最大值索引下标
>>> arr = np.arange(10)
>>> print(arr)
[0 1 2 3 4 5 6 7 8 9]
>>> print(np.argmax(arr))
9
>>> print(np.argmin(arr))
0
#返回一维数组,数组每个元素都是之前每个元素的累加和
>>> print(np.cumsum(arr))
[ 0  1  3  6 10 15 21 28 36 45]
#返回一个一维数组,数组的每一个元素都是之前所有元素的累加积
>>> print(np.cumprod(arr))
[0 0 0 0 0 0 0 0 0 0]
5.元素判断函数

np.any(): 至少有一个元素满足指定条件,返回True
np.all(): 所有的元素满足指定条件,返回True

>>> arr = np.random.randn(2,3)
>>> print(arr)
[[-1.00819042 -0.4116328  -0.0563122 ]
 [-0.71247075  0.37296051  0.62164402]]
>>> print(np.any(arr > 0))
True
>>> print(np.all(arr > 0))
False
6.元素去重排序函数

np.unique():找到唯一值并返回排序结果,类似于Python的set集合

>>> arr = np.array([[1, 2, 1], [2, 3, 4]])
>>> print(arr)
[[1 2 1]
 [2 3 4]]
>>> print(np.unique(arr))
[1 2 3 4]
小结

Ndarray数组的创建
随即创建和序列创建
Ndarray矩阵运算
适量运算、矢量和标量运算,切片
元素计算函数
元素统计函数
元素判断函数
元素去重排序函数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 文章来源:Python数据分析 目录: DIKW模型与数据工程科学计算工具Numpy数据分析工具PandasPan...
    一只写程序的猿阅读 1,383评论 0 3
  • 简介 Numpy:提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库。用...
    卢子野阅读 367评论 0 1
  • 一:前言 学了中国大学mooc的Python数据分析与展示课程感觉挺不错的,记录下来以后学习也方便多了。NumPy...
    梅花鹿数据阅读 3,706评论 0 8
  • 1.numpy简介 Numpy:提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵...
    零_WYF阅读 254评论 0 1
  • 常常听到耳边有人说寂寞,在夜晚突然想想自己,我是否也会感到孤独,答案是会。 什么是孤独,可能就和一百个人眼中有一百...
    最爱风阅读 527评论 0 2