Python入门 - 第 5 节课:Numpy基础

1. Nmupy处理一维数据

  • Numpy数组

  • Numpy array 与Python list的区别

image.png
  • 创建Numpy数组

  1. 首先创建一个Python列表
  2. 然后调用np.array(), 将该列表作为参数, 如下面的代码示例.

示例数据

import numpy as np

# First 20 countries with employment data
countries = np.array([
    'Afghanistan', 'Albania', 'Algeria', 'Angola', 'Argentina',
    'Armenia', 'Australia', 'Austria', 'Azerbaijan', 'Bahamas',
    'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium',
    'Belize', 'Benin', 'Bhutan', 'Bolivia',
    'Bosnia and Herzegovina'
])

# Employment data in 2007 for those 20 countries
employment = np.array([
    55.70000076,  51.40000153,  50.5       ,  75.69999695,
    58.40000153,  40.09999847,  61.5       ,  57.09999847,
    60.90000153,  66.59999847,  60.40000153,  68.09999847,
    66.90000153,  53.40000153,  48.59999847,  56.79999924,
    71.59999847,  58.40000153,  70.40000153,  41.20000076
])
  • 获取元素

print(countries[0])
print(countries[3])

Afghanistan
Angola
  • 切片

print(countries[0:3])
print(countries[:3])
print(countries[17:])
print(countries[:])

['Afghanistan' 'Albania' 'Algeria']
['Afghanistan' 'Albania' 'Algeria']
['Bhutan' 'Bolivia' 'Bosnia and Herzegovina']
['Afghanistan' 'Albania' 'Algeria' 'Angola' 'Argentina' 'Armenia'
 'Australia' 'Austria' 'Azerbaijan' 'Bahamas' 'Bahrain' 'Bangladesh'
 'Barbados' 'Belarus' 'Belgium' 'Belize' 'Benin' 'Bhutan' 'Bolivia'
 'Bosnia and Herzegovina']
  • 元素类型

print(countries.dtype)
print(employment.dtype)
print(np.array([0, 1, 2, 3]).dtype)
print(np.array([1.0, 1.5, 2.0, 2.5]).dtype)
print(np.array([True, False, True]).dtype)
print(np.array(['AL', 'AK', 'AZ', 'AR', 'CA']).dtype)

|S22 
float64
int64
float64
bool
|S2

备注: 其中S代表字符串, 22表示数组中最长的字符有22个字母

  • Looping

for country in countries:
    print('Examining country {}'.format(country))

for i in range(len(countries)):
    country = countries[i]
    country_employment = employment[i]
    print('Country {} has employment {}'.format(country,
            country_employment))
  • Numpy 常用函数

print(employment.mean())
print(employment.std())
print(employment.max())
print(employment.sum())

58.68500003850001
9.338269113687888
75.69999695
1173.70000077

备注: argmax()函数 - 返回最大值的位置

 

  • 向量化运算

这个概念来自于线性代数, 因此规则和线性代数中相同. 它和列表之间的相加不同, 如下图.

  • 向量加法

image.png
  • 向量与标量相乘

规则和线性代数中相同. 它和列表与一个数字相乘不同, 列表和一个数字相乘,则会重复这个列表中的值相应的次数, 形成一个新的列表, 如下图.

image.png
  • 更多的向量运算

image.png
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([1, 2, 1, 2])

print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a ** b)

[2 4 4 6]
[0 0 2 2]
[1 4 3 8]
[1 1 3 2]
[ 1  4  3 16]
a = np.array([1, 2, 3, 4])
b = 2

print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a ** b)

[3 4 5 6]
[-1  0  1  2]
[2 4 6 8]
[0 1 1 2]
[ 1  4  9 16]
a = np.array([True, True, False, False])
b = np.array([True, False, True, False])

print(a & b)
print(a | b)
print(~a)

print(a & True)
print(a & False)
               
print(a | True)
print(a | False)


[ True False False False]
[ True  True  True False]
[False False  True  True]
[ True  True False False]
[False False False False]
[ True  True  True  True]
[ True  True False False]
a = np.array([1, 2, 3, 4, 5])
b = np.array([5, 4, 3, 2, 1])

print(a > b)
print(a >= b)
print(a < b)
print(a <= b)
print(a == b)
print(a != b)

[False False False  True  True]
[False False  True  True  True]
[ True  True False False False]
[ True  True  True False False]
[False False  True False False]
[ True  True False  True  True]
a = np.array([1, 2, 3, 4])
b = 2

print(a > b)
print(a >= b)
print(a < b)
print(a <= b)
print(a == b)
print(a != b)


[False False  True  True]
[False  True  True  True]
[ True False False False]
[ True  True False False]
[False  True False False]
[ True False  True  True]

 

  • 标准化数据

为什么要对数据进行标准化?
在数据分析中, 一个常常需要回答的问题是, 某一个数据点与其他数据点相比有何取别?

例如 美国就业率与其他国家就业率的差异, 他比平均值更高还是更低? 两者相差多少?

如果要回答上述问题, 通常是将各数据点转换为相对于平均值的标准偏差值, 这叫做数据标准化.

比如2007年的就业数据, 平均就业率是58.6%, 标准偏差是10.5%, 美国就业率是62.3%, 那么美国就业率和平均就业率之间差距就是3.7%, 这约等于0.35个标准偏差, 而墨西哥2007年的平均就业率约为57.9%, 那么墨西哥就业率和平均就业率之间差距就是-0.7%, 注意, 负值表示这个值低于平均值, 正值表示高于平均值, 因此墨西哥可以转换为低于平均值0.067个标准偏差.

如何用numpy数组的向量化运算, 对一个数组中的所有值进行标准化?

代码如下:

def standardize_data(values):
'''传入一个数组. 然后用向量运算, 对该数组进行标准化'''
    standardized_values = (values - values.mean()) / values.std()
    return standardized_values

 

  • Numpy索引数组(index array)

image.png

何为索引数组
对于上图中的b即为索引数组, 它将返回数组a中, 在数组b中对应为True的元素, 因此a[b]所返回的就是3,4,5

索引数组的三种表现形式

  1. 构建如上图所示的布尔数组
  2. 数组b也可以用另外一种形式表示b = a > 2, 然后执行a[b]
  3. 为了实现上图中结果, 还可以直接直接使用a > 2作为索引数组, 而不用赋值给b, 即a[a>2]

代码示例:

使用索引数组

import numpy as np

# Using index arrays
a = np.array([1, 2, 3, 4])
b = np.array([True, True, False, False])

print(a[b])
print(a[np.array([True, False, True, False])])


[1 2]
[1 3]

使用向量化操作创建索引数组

a = np.array([1, 2, 3, 2, 1])
b = (a >= 2)

print(a[b])
print(a[a >= 2])

[2 3 2]
[2 3 2]

在另一个数组上使用向量化操作创建索引数组

a = np.array([1, 2, 3, 4, 5])
b = np.array([1, 2, 3, 2, 1])

print(b == 2)
print(a[b == 2])

[False  True False  True False]
[2 4]

 

  • 原位与非原位

+=: 原位运算, 会将所有的新值储存在原值所在的位置, 而不是创建一个新的数组
+: 非原位运算

二者区别见下图:

image.png

 
 

2. Nmupy处理二维数据

  • Numpy二维数组

  • Numpy 2D-array 与Python List of lists的区别

image.png

示例数据

import numpy as np

# Subway ridership for 5 stations on 10 different days
ridership = np.array([
    [   0,    0,    2,    5,    0],
    [1478, 3877, 3674, 2328, 2539],
    [1613, 4088, 3991, 6461, 2691],
    [1560, 3392, 3826, 4787, 2613],
    [1608, 4802, 3932, 4477, 2705],
    [1576, 3933, 3909, 4979, 2685],
    [  95,  229,  255,  496,  201],
    [   2,    0,    1,   27,    0],
    [1438, 3785, 3589, 4174, 2215],
    [1342, 4043, 4009, 4665, 3033]
])
  • 获取元素

print(ridership[1, 3])
print(ridership[1:3, 3:5])
print(ridership[1, :])

2328

[[2328 2539]
 [6461 2691]]

[1478 3877 3674 2328 2539]
  • 向量化运算与向量化运算

print(ridership[0, :] + ridership[1, :])
print(ridership[:, 0] + ridership[:, 1])

[1478 3877 3676 2333 2539]

[   0 5355 5701 4952 6410 5509  324    2 5223 5385]
  • 2D-数组间的向量化运算

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])
print(a + b)


[[ 2  3  4]
 [ 6  7  8]
 [10 11 12]]

 

  • Numpy数轴

在许多情况下, 需要对列或行进行操作, 那么就需要用到数轴的知识. 比如图中所示, 每一行代表一个日期点, 每一列代表一个车站, 我们可以对每个车站求平均客流量, 当然我也可以求每天的平均客流量.

Numpy中的大多数函数都将数轴作为参数之一, 其值通常为0或1.

image.png

代码示例

import numpy as np

# NumPy axis argument
a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

print(a.sum())
print(a.sum(axis=0))
print(a.sum(axis=1))


45
[12 15 18]
[ 6 15 24]

 

  • Numpy数据类型

  • dtype

适用于二维数组

import numpy as np
np.array([1,2,3,4,5]).dtype

dtype('int64')

,不过需要注意的数组中的每一个元素都属于同一类型, 如果为多种类型, 最终形成数组后, 都将被转换为字符串.

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

推荐阅读更多精彩内容