Python 数据科学笔记1

Python DataScience Handbook 学习笔记1

第一部分 numpy

相比较于python内置的数据类型,numpy提供了更为高效的数据操作.
首先我们要了解一下python内置的数据类型.以Integer为例,C代码的实现如下

# This code illustrates why python allows dynamic typing
struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};

int 类型在实现中是一个指向上述结构体的指针;

numpy中的核心:array

numpy array 与 list的对比可以通过下图来体会:


diff

创建

接下来我们通过实例来看一下在numpy中如何简单优雅地创建数组

In [1]: import numpy as np

In [2]: np.__version__
Out[2]: '1.13.3'

In [3]: np?

In [4]: np.array([3.14, 3, 1, 2])
Out[4]: array([ 3.14,  3.  ,  1.  ,  2.  ])

In [5]: np.zeros((3, 5), dtype=int)
Out[5]: 
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

In [6]: np.arange(0,20,2)
Out[6]: array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])

In [7]: np.linspace(0,1,5)
Out[7]: array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ])

In [8]: np.random.random((3,3))
Out[8]: 
array([[ 0.43170959,  0.10099413,  0.45859315],
       [ 0.62548971,  0.57233299,  0.6632921 ],
       [ 0.74947709,  0.31867245,  0.05988924]])

In [9]: np.random.normal(0, 1, (3,3))
Out[9]: 
array([[-1.45242445, -1.27771487,  1.39220407],
       [-0.66294773, -1.56926783, -0.02177722],
       [ 1.0318081 , -0.87103441,  0.78930381]])

In [10]: np.random.randint(0, 10, (3, 3))
Out[10]: 
array([[0, 5, 8],
       [2, 7, 7],
       [5, 0, 5]])

In [11]: np.zeros(10, dtype=np.complex128)
Out[11]: 
array([ 0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,  0.+0.j,
        0.+0.j,  0.+0.j,  0.+0.j])


基本操作

对于一维的数组,与python原生的操作非常相似,在此不在赘述。我在这里列出了一些较为fancy的部分.

In [5]: x2 = np.random.randint(15, size = (3,5), dtype='int')

In [6]: x2
Out[6]: 
array([[ 8,  8,  5, 11, 13],
       [ 2, 14,  2,  9,  6],
       [ 8, 14,  6,  4,  9]])

In [7]: x2[::-1, ::-1]
Out[7]: 
array([[ 9,  4,  6, 14,  8],
       [ 6,  9,  2, 14,  2],
       [13, 11,  5,  8,  8]])


与matlab类似,numpy可以通过:符号来实现整行整列的访问

x2[:, 0] # first column of x2
x2[0, :] # first row of x2

接下来我们要强调非常重要的一点:在对numpy中的array作slice等操作时,与原生列表有很大的不同,主要表现为它会产生一个"view"而非一个"copy"。通俗的说就是它不重新分配内存,创建列表,而是直接在原始数据上操作。

In [8]: x = [1,2,3,4,5]

In [9]: y = np.array([1,2,3,4,5])

In [10]: copy = x[1:3]
In [12]: copy[1] = 1

In [13]: copy
Out[13]: [2, 1]

In [14]: not_copy = y[1:3]
In [16]: not_copy[1] = 1

In [17]: not_copy
Out[17]: array([2, 1])

In [18]: x
Out[18]: [1, 2, 3, 4, 5]

In [19]: y
Out[19]: array([1, 2, 1, 4, 5])


当然,只要显式地调用copy()就能创建一个copy而非view.

x2_sub_copy = x2[:2, :2].copy()

reshape

x = np.array([1, 2, 3])

# row vector via reshape
x.reshape((1, 3))
Out[39]:
array([[1, 2, 3]])
In [40]:
# row vector via newaxis
x[np.newaxis, :]
Out[40]:
array([[1, 2, 3]])
In [41]:
# column vector via reshape
x.reshape((3, 1))
Out[41]:
array([[1],
       [2],
       [3]])
In [42]:
# column vector via newaxis
x[:, np.newaxis]
Out[42]:
array([[1],
       [2],
       [3]])

Concatenation

grid = np.array([[1, 2, 3],
                 [4, 5, 6]])
In [46]:
# concatenate along the first axis
np.concatenate([grid, grid])
Out[46]:
array([[1, 2, 3],
       [4, 5, 6],
       [1, 2, 3],
       [4, 5, 6]])
In [47]:
# concatenate along the second axis (zero-indexed)
np.concatenate([grid, grid], axis=1)
Out[47]:
array([[1, 2, 3, 1, 2, 3],
       [4, 5, 6, 4, 5, 6]])
      

Splitting

x = [1, 2, 3, 99, 99, 3, 2, 1]
x1, x2, x3 = np.split(x, [3, 5])
print(x1, x2, x3)
[1 2 3] [99 99] [3 2 1]
In [23]: grid = np.arange(16).reshape((4,4))

In [24]: grid
Out[24]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [25]: a, b = np.vsplit(grid, [3])

In [26]: a
Out[26]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

In [27]: b
Out[27]: array([[12, 13, 14, 15]])

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

推荐阅读更多精彩内容