2018-04-15 开胃学习Python系列 - Numpy

Numpy使我们能够高效地工作在Python中的阵列(arrays)和矩阵(matrices)。
下面是最基础的Numpy知识,这个帖子将会进行长期补充。

Start A Array

可以建立一个列表List, 并将其转换为阵列Array

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

或者更直接

y = np.array([4, 5, 6])
m = np.array([[7, 8, 9], [10, 11, 12]])






对于arange函数,我们传递一个开始start,一个停止stop和一个跨步step的值, 并在给定的间隔内返回均匀跨步的值。

n = np.arange(0, 30, 2) # start at 0 count up by 2, stop before 30
>>>
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28])






想把这个array 转换成一个3x5的阵列

n = n.reshape(3, 5) # reshape array to be 3x5
array([[ 0,  2,  4,  6,  8],
       [10, 12, 14, 16, 18],
       [20, 22, 24, 26, 28]])






linspace函数类似于arange,除了告诉需要返回多少个数字,它会相应地分隔间隔。

o = np.linspace(0, 4, 9) # return 9 evenly spaced values from 0 to 4
o
>>> array([ 0. ,  0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ])






Numpy还有几个内置函数和快捷方式来创建阵列。

  • ones返回一个都是1的阵列
  • zeros是一个都是0的阵列
  • eye返回一个阵列,其中对角线是1,其他是0的
  • diag构造一个对角阵列
np.ones((3, 2))
>>>
array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])

np.zeros((2, 3))
>>>
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])


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

y = np.array([4, 5, 6])
np.diag(y)
>>>
array([[4, 0, 0],
       [0, 5, 0],
       [0, 0, 6]])






索引(index)和切片(slice)

创建一个array,0到12的每个数都进行平方

s = np.arange(13)**2
s
>>> array([  0,   1,   4,   9,  16,  25,  36,  49,  64,  81, 100, 121, 144])
  • 用方括号,里面是数字 获取特定索引的值
s[0], s[4], s[-1]
>>>(0, 16, 144)
  • 用冒号(:)符号获取范围
  • 第一个例子从索引1开始的范围, 并在索引5之前停止
s[1:5]
>>>array([ 1,  4,  9, 16])
  • 用负数从array的末尾倒数
  • 指定起始或结束索引不是必需的,直接 : 就不写了
  • array 的最后四个元素
s[-4:]
>>>array([ 81, 100, 121, 144])
  • array 的末尾第五开始, 每步向后倒退两位
    A second : can be used to indicate step-size. array[start:stop:stepsize]
s[-5::-2]
>>> array([64, 36, 16,  4,  0])






Multidimensional array.

r = np.arange(36)
r.resize((6, 6))
r
>>>
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])

#Use bracket notation to slice: array[row, column]
r[2, 2]
>>> 14

# select a range of rows or columns
r[3, 3:6]
>>>
array([21, 22, 23])
  • 直到前两列,直到最后一行
#selecting all the rows up to (and not including) row 2
#and all the columns up to (and not including) the last column.
r[:2, :-1]
>>>
array([[ 0,  1,  2,  3,  4],
       [ 6,  7,  8,  9, 10]])

r[-1, ::2]
>>>
array([30, 32, 34])
  • 方括号运算符进行条件索引
# conditional indexing

r[r > 30]
>>>
array([31, 32, 33, 34, 35])

r[r > 30] = 30
r
>>>
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 30, 30, 30, 30, 30]])






Copy Data

  • 创建一个新的new array r2,它是array r的一个切片
  • 把这个阵列的所有元素设置为零
  • 看原始阵列r时, 可以看到r中的slice也被改变了
  • 所以这是需要记住的, 在使用Numpy阵列时要小心: 如果我们希望创建副本,但不更改原始阵列r, 可以使用r.copy()
r2 = r[:3,:3]
r2
>>>
array([[ 0,  1,  2],
       [ 6,  7,  8],
       [12, 13, 14]])

r2[:] = 0
r2
>>>
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

r
>>>
array([[ 0,  0,  0,  3,  4,  5],
       [ 0,  0,  0,  9, 10, 11],
       [ 0,  0,  0, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 30, 30, 30, 30, 30]])
# use r.copy to create a copy that will not affect the original array
r_copy = r.copy()
r_copy
>>>
array([[ 0,  0,  0,  3,  4,  5],
       [ 0,  0,  0,  9, 10, 11],
       [ 0,  0,  0, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 30, 30, 30, 30, 30]])


r_copy[:] = 10
print(r_copy, '\n')
print(r)
>>>
[[10 10 10 10 10 10]
 [10 10 10 10 10 10]
 [10 10 10 10 10 10]
 [10 10 10 10 10 10]
 [10 10 10 10 10 10]
 [10 10 10 10 10 10]] 

[[ 0  0  0  3  4  5]
 [ 0  0  0  9 10 11]
 [ 0  0  0 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]
 [30 30 30 30 30 30]]
  • 将r_copy中所有元素的值更改为10, 则原始阵列r保持不变






Iterating Over Arrays

test = np.random.randint(0, 10, (4,3))
test
>>>
array([[4, 8, 7],
       [7, 8, 3],
       [9, 1, 3],
       [7, 5, 4]])

#Iterate by row:
for row in test:
    print(row)
>>>
[4 8 7]
[7 8 3]
[9 1 3]
[7 5 4]

#Iterate by index:
for i in range(len(test)):
    print(test[i])
>>>
[4 8 7]
[7 8 3]
[9 1 3]
[7 5 4]

#Iterate by row and index:
for i, row in enumerate(test):
    print('row', i, 'is', row)
>>>
row 0 is [4 8 7]
row 1 is [7 8 3]
row 2 is [9 1 3]
row 3 is [7 5 4]

#Use zip to iterate over multiple iterables
test2 = test**2
test2
>>>
array([[16, 64, 49],
       [49, 64,  9],
       [81,  1,  9],
       [49, 25, 16]])

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

推荐阅读更多精彩内容