Python科学计算神器之Numpy-3

  • 这节承接Numpy-2, 对多维数组和一些通用规则进行学习
  • 如果喜欢就关注吧,也许下一次也会喜欢呢.

4.5 多维数组的存取

>>>import numpy as np

# 采用fromfunction创建多维数组
>>>def f(x, y):
...    return 10*x + y
>>>a = np.fromfunction(f, (6,6), dtype=int)
>>>a
array([[ 0,  1,  2,  3,  4,  5],
       [10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25],
       [30, 31, 32, 33, 34, 35],
       [40, 41, 42, 43, 44, 45],
       [50, 51, 52, 53, 54, 55]])
# 另一种创建该数组的方法,需要用到Broadcasting rules,后续会讲到
>>>np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6)
array([[ 0,  1,  2,  3,  4,  5],
       [10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25],
       [30, 31, 32, 33, 34, 35],
       [40, 41, 42, 43, 44, 45],
       [50, 51, 52, 53, 54, 55]])

4.5.1 多维数组的indexing,Slicing

  • 同一维数组一致,采用和Python的list操作一样的方式可以取值,但仍然是共享数据空间.
  • 多维数组中,索引可以tuple格式出现,例如: a[0,3] = a[0][3]
# 如果是单个值,则为相应数据类型;如果是多个值,则为Array数组
>>>a[0,3], a[0][3], a[0,3:5], a[0][3:5], type(a[0,3]), type(a[0,3:])
(3, 3, array([3, 4]), array([3, 4]), numpy.int64, numpy.ndarray)
图1 使用数组切片语法访问多维数组中的元素
# 注意下面slicing越界,numpy并不报错,按到边界为止
# 每个维度取值方式同一维数组一致
>>>a[4:9,4:]
array([[44, 45],
       [54, 55]])
>>>a[4:9,4:].shape, a[4:,4:].shape # shape并不是(8, 2)
((2, 2), (2, 2))
>>>b = a[0,3]
>>>b = -100
>>>a
array([[ 0,  1,  2,  3,  4,  5],
        [10, 11, 12, 13, 14, 15],
        [20, 21, 22, 23, 24, 25],
        [30, 31, 32, 33, 34, 35],
        [40, 41, 42, 43, 44, 45],
        [50, 51, 52, 53, 54, 55]])

4.5.2 使用整数序列和布尔数组进行存取

此时和一维数组一致,它们不共享数据空间. 类似坐标系对应的x轴和y轴,多维数组每一个维度为一个轴,对应第0轴、第1轴...(二维也称横轴、纵轴)

  • a[(0,1,2,3,4),(1,2,3,4,5)] : 用于存取数组的下标和仍然是一个有两个元素的组元,组元中的每个元素都是整数序列,分别对应数组的第0轴和第1轴。从两个序列的对应位置取出两个整数组成下标: a[0,1], a[1,2], ..., a[4,5].
  • a[3:, [0, 2, 5]] : 下标中的第0轴是一个范围,它选取第3行之后的所有行;第1轴是整数序列,它选取第0, 2, 5三列.
  • a[mask, 2] : 下标的第0轴是一个布尔数组,它选取第0,2,5行;第1轴是一个整数,选取第2列.
图2 使用整数序列和布尔数组访问多维数组中的元素

4.6 特殊的indexing、Slicing方法和Iterating

4.6.1 缺失的索引轴

当多维数组提供的索引数少于轴数时,缺失的轴默认是全部包含,这点和Python的list以及Pandas都是相同的. 对于每个轴均可以按照一位数组来索引取值.

>>># 最后一行,等同于b[-1,:]
>>>a[-1]
array([50, 51, 52, 53, 54, 55])

4.6.2 关于(...)的使用

Numpy可以用...来补全缺失的索引轴,例如:b[i,:]可以被写为b[i, ...]. 通常有如下三种情况:

  • x[1, 2, ...] 等同 x[1,2,:,:,:]
  • x[..., 3] 等同 x[:,:,:,:,3]
  • x[4, ..., 5, :] 等同 x[4, :, :, 5, :]
>>>b = np.array([[[0, 1, 2], [5, 6, 7]], [[100, 101, 102],[110, 112, 113]]])
>>>b
array([[[  0,   1,   2],
        [  5,   6,   7]],
       [[100, 101, 102],
        [110, 112, 113]]])

>>>b.shape
(2, 2, 3)
>>>b[1, ...]
array([[100, 101, 102],
        [110, 112, 113]])

>>>b[1,...,2]
array([102, 113])
  • Iterating:多维Array的总是值第一个轴,即第0轴
>>>for row in b:
...    print(row)
 [[0 1 2]
  [5 6 7]]
[[100 101 102]
[110 112 113]]
  • flat:如果需要获取数组中每个元素,则使用Array的flat属性.
>>>for element in b.flat:
...    print(element)
 0
 1
 2
 5
 6
 7
 100
 101
 102
 110
 112
 113
  • 当某个轴的元素为-1时,将根据数组元素的个数自动计算此轴的长度.
>>>b.shape = -1
>>>b
array([  0,   1,   2,   5,   6,   7, 100, 101, 102, 110, 112, 113])
  • ndenumerate:就像我们期望的Python的list那样,Numpy当然提供了枚举函数ndenumerate(). 当然,Iteration默认是有next()方法的.
>>>c = np.array([[1, 2], [3, 4]])
>>>for index, x in np.ndenumerate(c):
...    print(index, x)
((0, 0), 1)
((0, 1), 2)
((1, 0), 3)
((1, 1), 4)

>>>np.ndenumerate(c)
<numpy.lib.index_tricks.ndenumerate at 0x7f21cc0dbb90>

>>>np.ndenumerate(c).next()
((0, 0), 1)
  • indices:Numpy提供了indices()函数. shape属性提供了Array每个维度的长度. 如果一个Array的shape返回的是长度为N 的tuple (r0, ..., rN-1), indices返回的tuple就是(N, r0, ..., rN-1), 第一个值为Array的维数,也即为Array的轴数.

  • 函数原型:numpy.indices(dimensions, dtype= <type 'int'>)

  • grid.shape = (len(dimensions),) + tuple(dimensions)

>>>grid = np.indices((2,3)) 
>>>grid.shape
(2, 2, 3)

# row indices
>>>grid[0]
array([[0, 0, 0],
       [1, 1, 1]])

# column indices
>>>grid[1]
array([[0, 1, 2],
       [0, 1, 2]])

将indices用于Array的索引:

# 获取的是前2行和前3列
>>>row, col = np.indices((2, 3))
>>>a[row, col]
array([[ 0,  1,  2],
       [10, 11, 12]])

# 更直接的方式
>>>a[:2, :3]
array([[ 0,  1,  2],
       [10, 11, 12]])
  • 另外需要注意,a[(1, 2), ]和a[(1, 2)]的不同,后者等同于a[1 , 2],前者相当于第0轴按整数取值,其他轴缺失.
>>>a[(1, 2),]
array([[10, 11, 12, 13, 14, 15],
        [20, 21, 22, 23, 24, 25]])

>>>a[(1, 2)], a[1, 2]
(12, 12)

关于Numpy的取值部分除了某些tricks算比较完整了,后续先对Array的特性做进一步的介绍,然后再整体对某些比较trick的tricks进行学习.

Enjoy it~

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

推荐阅读更多精彩内容