NumPy核心概念

NumPy是Python数据科学生态中重要的基础成员,其中有几个概念比较tricky,简单记录之。更佳阅读体验,可移步NumPy核心概念

N维数组

NumPy最核心的数据类型是N维数组The N-dimensional array (ndarray),可以看成homogenous(同质) items的集合,与只密切相关的两种类型是Data type objects (dtype)Scalars

tool-np-ndarray

比如典型数组

>>> x = np.array([[5.2, 3.0, 4.5], [9.1, 0.1, 0.3]], np.float32)
>>> x
array([[5.2, 3. , 4.5],
       [9.1, 0.1, 0.3]], dtype=float32)
tool-np-nparray

数据类型对象(np.dtype)

数据类型对象是用来描述与数组对应的内存区域如何使用,具体几个方面

  • 数据的类型(整数,浮点数或者 Python 对象)
  • 数据的大小(例如, 整数使用多少个字节存储)
  • 数据的字节顺序(小端法或大端法)
  • 在结构化类型的情况下,字段的名称、每个字段的数据类型等
  • 如果数据类型是子数组,它的形状和数据类型

可理解为N维数组item的相关元信息,因为item可以存储较复杂类型,元信息很必要。

NumPy数据类型(scalar types)

Python原生的整型和浮点型分别只有一种,在科学计算中显然是不够的,NumPy定义更丰富的数据类型,比如:

  • bool_
  • int_/int8/int16/int32/int64
  • uint8/uint16/uint32/uint64
  • float_/float16/float32/float64
  • complex_/complex64/complex128
  • ...

有几点坑

关于bool_,由于Python中BooleanType不允许被继承,所以

The bool_ type is not a subclass of the int_ type (the bool_ is not even a number type). This is different than Python’s default implementation of bool as a sub-class of int.

关于int_

The int_ type does not inherit from the int built-in under Python 3, because type int is no longer a fixed-width integer type.

此外

The default data type in NumPy is float_.

常数

数学中遇到的一些常数,比如

  • np.Inf/np.NINF
  • np.e/np.pi
  • np.nan/np.NaN/np.NAN (aliases)
  • np.newaxis

ufunc

在N维数组上,element-wise操作,涵盖多数常见操作,详细列表见Universal functions (ufunc)

A universal function (or ufunc for short) is a function that operates on ndarrays in an element-by-element fashion. It is a “vectorized” wrapper for a function that takes a fixed number of specific inputs and produces a fixed number of specific outputs.

NumPy里axes相关知识点有点tricky。比如二维数组中np.sum()中指定axis参数的情况

>>> a = np.array([[0,1], [2, 3]])
>>> np.sum(a, axis=0)
array([2, 4])
>>> np.sum(a, axis=1)
array([1, 5])

其中axis=0总感觉跟直觉相反,但这样理解更顺一些

The way to understand the "axis" of numpy sum is it collapses the specified axis. So when it collapses the axis 0 (row), it becomes just one row and column-wise sum.

指定某个axis,就是沿着这个axis做相关操作。其中二维数组中两个axis的指向如下图

tool-np-axis-2d

对一维数组,情况有点特殊,如下例子

>>> a = np.array([1,2])
>>> b = np.array([3,4])
>>> np.concatenate([a, b], axis=0)
array([1, 2, 3, 4])

并没有和二维数组那样,从上向下地操作,而是水平的,因为一维数组其axis=0指向如下

tool-np-axis-1d
>>> a = np.array([1,2])
>>> a.shape
(2,)

从一维数组的shape也能看出axis=0的指向。

广播

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。比如当一个scalar与N维数组相加时,自动触发广播机制。

广播的原则很简单

  • 让所有输入数组都向形状最长的数组看齐,形状中不足的通过在前面加1补齐
  • 输出数组的形状是输入数组形状的各个维度上的最大值
  • 如果输入数组的某个维度和输出数组的对应维度长度相同或其长度为1时,这个数组能计算出来,否则报错
  • 当输入数组的某个维度的长度为1时,沿着此维度运算时用此维度的第一组值

几个数组可以广播到某一个shape,满足以下一个条件即可

  • 数组拥有相同形状
  • 当前维度的值相等
  • 当前维度的值有一个是1

例子

If a.shape is (5,1), b.shape is (1,6), c.shape is (6,) and d.shape is () so that d is a scalar, then a, b, c, and d are all broadcastable to dimension (5,6); and

  • a acts like a (5,6) array where a[:,0] is broadcast to the other columns,
  • b acts like a (5,6) array where b[0,:] is broadcast to the other rows,
  • c acts like a (1,6) array and therefore like a (5,6) array where c[:] is broadcast to every row, and finally,
  • d acts like a (5,6) array where the single value is repeated.

如下示意图比较很清晰

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

推荐阅读更多精彩内容