Python学习笔记:NumPy

什么是NumPy?

NumPy is the fundamental package for scientific computing with Python. It contains among other things:

  • a powerful N-dimensional array object
  • sophisticated (broadcasting) functions
  • tools for integrating C/C++ and Fortran code
  • useful linear algebra, Fourier transform, and random number capabilities

以上是NumPy官网给的定义,翻译如下:
NumPy是用Python进行科学计算的基础包,它包含一下内容:

  1. 一个强大的N维数组对象Array
  2. 复杂而精确的函数库
  3. 集成了C/C++和Fortran代码的工具
  4. 有用的线性代数、傅立叶变换和随机数生成函数

简而言之,numpy模块为Python提供了N维数组运算的支持,它可以支持高维度的数组和矩阵运算并且提供了大量的数学函数库。

创建数组

Function Description
np.array 把 list, tuple, array, 或者其他的序列模式的数据转换为 ndarray, 默认创建一个新的ndarray,可以推断出dtype,也可以显式指定dtype
np.asarray 把其他类型的数据转换成为ndarray, 如果是ndarray 输入则默认不进行 copy, 而如果是其他类型数据则创建新的ndarray
np.arange 类似于内置的range 函数, 创建一个序列,但返回的是ndarray,而不是列表
np.ones,np.ones_like 根据指定的形状和dtype创建一个全1数组,ones_like以另一个数组为参考,并根据其形状和dtype创建一个全1数组
np.zeros,np.zeros_like 类似于np.ones
np.empty,np.empty_like 创建空数组, 类似于np.ones,只分配内存空间但不填充任何值
eye 创建对角线为1其余为0的矩阵
identity 创建对角线为1其余为0的方阵

代码示例:

>>> import numpy as np

>>> d = [2, 4, 3, 1, 6, 6]
>>> a = np.array(d)
>>> a
array([2, 4, 3, 1, 6, 6])
>>> type(a)
<type 'numpy.ndarray'>
>>> d2 = [[2, 4], [3, 1], [6, 6]]
>>> a2 = np.array(d2)
>>> a2
array([[2, 4],
       [3, 1],
       [6, 6]])

>>> a3 = np.asarray(a2)
>>> a3 is a2
True
>>> d1 = d
>>> d1
[2, 4, 3, 1, 6, 6]
>>> a4 = np.asarray(d1)
>>> a4
array([2, 4, 3, 1, 6, 6])
>>> a4 is d1
False

>>> np.ones(2)
array([ 1.,  1.])
>>> np.ones((2,3))
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
>>> np.ones_like(a3)
array([[1, 1],
       [1, 1],
       [1, 1]])
>>> np.ones_like(a2)
array([[1, 1],
       [1, 1],
       [1, 1]])

>>> np.eye(2)
array([[ 1.,  0.],
       [ 0.,  1.]])
>>> np.eye(2,3)
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.]])
>>> np.identity(3)
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

属性

Attributes Description
np.size ndarray 的属性, ndarray 的元素的数量.
np.dtype ndarray 的属性, ndarray 的元素的类型, 和 C/C++ 中的类型有对应关系.
np.itemsize ndarray 的属性, 元素的字节数, 例如一个 dtype 为 float64 的 ndarray 的元素的大小为 8.
np.ndim ndarray 的属性, ndarray 的维度数.
np.shape ndarray 的属性, 为包含 ndarray 每个维度的大小的 tuple.

数组变换

  • np.reshape: 返回一个新的按照给定的维度改变的 ndarray
  • np.resize: 在原位修改 ndarray 的维度
  • np.ravel: 把ndarray变为一维的数组,格式、元素数量不变
  • np.squeeze: 返回一个把长度为 1 的维度去掉的 ndarray
>>> x = np.array([[[0], [1], [2]]])
>>> x.shape
(1, 3, 1)
>>> x.squeeze()
array([0, 1, 2])
>>> x.squeeze().shape
(3,)

运算

  • np.nonzero(a)/a.nonzero(): 返回一个tuple,包含所有不为0的元素的索引
>>> a
array([[ 4,  0,  6],
       [ 2, 12, 12]])
>>> a.nonzero()
(array([0, 0, 1, 1, 1]), array([0, 2, 0, 1, 2])) # 返回了五个indices,没有返回(0, 1)的索引
  • x.repeat()
>>> x = np.array([[1,2],[3,4]])
>>> x.repeat(2) # 按元素重复
array([1, 1, 2, 2, 3, 3, 4, 4])
>>> x.repeat(2,axis=0) # 按行重复
array([[1, 2],
       [1, 2],
       [3, 4],
       [3, 4]])
>>> x.repeat(2,axis=1) # 按列重复
array([[1, 1, 2, 2],
       [3, 3, 4, 4]])
  • np.compress: 按照给定的bool list来选取ndarray中的值, 返回一个新的 ndarray
>>> a
array([[6, 2, 4, 5, 5, 3],
       [6, 9, 5, 1, 3, 5]])
>>> a.compress([True, True, False, False, True])
array([6, 2, 5])
>>> a
array([[6, 2, 4, 5, 5, 3],
       [6, 9, 5, 1, 3, 5]])
>>> a.compress([True, True, False, False, True], axis=1)
array([[6, 2, 5],
       [6, 9, 3]])
>>> a.compress([True, True, False, False, True], axis=0) # 因为没有五行,所以会错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: index 4 is out of bounds for size 2
>>> a.compress([True, False], axis=0)
array([[6, 2, 4, 5, 5, 3]])
>>> a.compress([False, True], axis=0)
array([[6, 9, 5, 1, 3, 5]])
  • np.argsort(b)/b.argsort(): 返回元素排序所对应的序号
  • np.sort(b)/b.sort(): 在原位排序
>>> b
array([[ 6,  2,  4,  5,  5,  3],
       [ 1,  3, 10,  5,  6,  9]])
>>> b.argsort()
array([[1, 5, 2, 3, 4, 0],
       [0, 1, 3, 4, 5, 2]])
>>> np.sort(b)
array([[ 2,  3,  4,  5,  5,  6],
       [ 1,  3,  5,  6,  9, 10]])

单目运算函数

np.max: 返回最大值
np.argmax: 返回最大的值的序号
np.min: 返回最小值
np.argmin: 返回最小的值的序号
np.absolute: 计算绝对值,np.absolute(a) 或者 np.abs(a),对于非复数的数组,np.fabs 速度更快
np.exp: 计算 e 的指数
np.sqrt: 计算平方根
np.square: 计算平方
np.log, np.log10, np.log2, np.log1p: 分别为以 e, 10, 2 为底取 log, 和 log(1 + x)
np.sign: 取数值的正负号
np.ceil: 计算比每一个元素大或相等的最小的整数
np.floor: 计算比每一个元素小或相等的最大的整数
np.rint: 近似到最近的整数
np.clip(a, a_min, a_max, out=None): 返回一个 ndarray, 其元素的值如果小于min,就会被min值替代;如果大于max,就会被max值替代
np.modf: 返回一个 tuple, 包含两个数组, 一个是小数部分, 一个是整数部分
np.cos, np.cosh, np.sin, np.sinh, np.tan, np.tanh, np.arccos, np.arccosh, np.arcsin, np.arcsinh, np.arctan, np.arctanh: 三角函数和反三角函数

>>> c
array([  6,   2,   4,   5,   5,   3,   1,   3, 100,   5,   6,   9])
>>> c.clip(2, 10)
array([ 6,  2,  4,  5,  5,  3,  2,  3, 10,  5,  6,  9])
>>> c
array([  6,   2,   4,   5,   5,   3,   1,   3, 100,   5,   6,   9])
>>> c.clip([3,4,1,1,1,4,4,4,4,4,10,10], 8)
array([ 6,  4,  4,  5,  5,  4,  4,  4,  8,  5, 10, 10])

双目运算函数

np.add(a, b): 两个数组元素一一对应相加.
np.substract(a, b): 两个数组元素一一对应相减.
np.multiply(a, b): 两个数组元素一一对应相乘.
np.devide(a, b): 两个数组元素一一对应相除.
np.maximum, np.fmax: 一一比较两个数组中元素大小, 返回相应位置最大的. np.fmax 会忽略 np.NAN, 而 np.maximum 则返回 np.NAN.
np.minimum, np.fmin: 一一比较两个数组中元素大小, 返回相应位置最小的. np.fmin 会忽略 np.NAN, 而 np.minimum 则返回 np.NAN.

集合运算

np.unique: 返回所有不重复的元素排序后的数组
np.intersect1d: 返回两个数组交集后排序的数组
np.union1d: 返回两个数组并集后排序的数组
np.in1d: 返回一个布尔值数组, 判断一个数组元素是否在另一个数组中
np.setdiff1d: 返回一个数组, 其中包含在第一个输入数组而不在第二个输入数组的元素
np.setxor1d 返回不同时在两个输入数组的元素的数组

统计方法

用于布尔数组的统计方法:

sum : 统计数组/数组某一维度中的True的个数
any: 统计数组/数组某一维度中是否存在一个/多个True
all:统计数组/数组某一维度中是否都是True

普通的统计方法:

np.sum: 计算数组的和, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的和
np.mean: 计算数组的均值, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的均值
np.std: 计算数组的标准差, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的标准差
np.var: 计算数组的标准差, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的标准差
np.min, np.max: 计算数组的最小值或最大值, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的最小值或最大值
np.argmin, np.argmax: 计算数组的最小值或最大值的 index, 可以设置参数 axis 为 0 或者 1 单独计算每行或每列的最小值或最大值 index
np.cumsum: 累加
np.cumprod: 累乘

参考至:

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

推荐阅读更多精彩内容