numpy.array多维数组的切片操作总结

一 常规介绍

1 一维数组切片

一维数组类似于一条直线(一维),其上的坐标位置用一个数字就可表示,一个数字代表一个位置,对应一个值。

>>> b=np.random.randint(1,10,[10])
>>> b
array([6, 5, 2, 3, 9, 9, 3, 8, 5, 8])

# 正向第i个元素到第j个元素:
>>> i=1
>>> j=8
>>> b[i:j]
array([5, 2, 3, 9, 9, 3, 8])

# 返回b[i],b[i+1],···,b[j-1]的元素
>>> i=1
>>> j=2
>>> b[i:j]
array([5])

# 左闭右开,第j个元素不返回。
>>> b[::2]
array([6, 2, 9, 3, 5])

# 反向 倒数几个元素: 
# start和end为负数则是反向取元素, 
# 取b[start+1] ,b[start+2],···,b[end]的元素
>>> b[-3:-1]
array([8, 5])

2 二维数组的切片

二维数组类似于一个平面(二维),其上的坐标位置要用两个数字来表示,两个数字代表一个位置,对应一个值。

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

# 取 第i行到第j行:
>>> a[2:4,:]
array([[6, 4, 1, 2, 7],
       [4, 9, 3, 5, 9]])
# 第i列到第j列:
>>> a[:,2:4]
array([[4, 9],
       [6, 4],
       [1, 2],
       [3, 5]])

多维的切片是在中括号中用逗号运算符, 将不同维上的操作分开,分割开后每个维度上单独维护即可。

3 维数超过 3 的多维数组,可通过 ‘…’ 来简化操作

# coding: utf-8
import numpy as np
 
arr = np.arange(24).reshape((2, 3, 4))
 
print arr[1, ...]               # 等价于 arr[1, :, :]
print arr[..., 1]               # 等价于 arr[:, :, 1]

4 numpy中对切片元素的操作会影响原数组本身

>>> a[:1,:1]=[[100]]
>>> a
array([[100,   8,   4,   9,   8],
       [  4,   1,   6,   4,   2],
       [  6,   4,   1,   2,   7],
       [  4,   9,   3,   5,   9]])

5 array和list的对比

访问多维数组的一个特定位置的元素

# array的用法
import numpy as np

arr = np.array([
    [1, 2, 3, 4],
    [2, 4, 6, 8],
    [3, 6, 9, 12],
    [4, 8, 12, 16]
])
print('第二行第二列的值:', arr[1, 1])

# list的用法
# coding: utf-8
arr = [
    [1, 2, 3, 4],
    [2, 4, 6, 8],
    [3, 6, 9, 12],
    [4, 8, 12, 16]
]
print('第二行第二列的值:', arr[1][1])

list的用法array也可以那样用,对于array来说,arr[1][1]就是先取出arr的第一行,然后再取arr的第一行的第一个。对于array来说,arr[index]——括号中的索引值只有一个的话,只能表示对array的第一个维度进行索引;arr[index][index]——表示先取出arr的第一个维度的index,再取出arr[index]的index。

如果只是二维数组,这种差别可能看起来并不大,但想象一下假如有一个 10 维的数组,用 Python 的标准做法需要写 10 对中括号,而用 Numpy 依然只需要一对。

6 boolean/mask index

用一个由 boolean 类型值组成的数组来选择元素的方法。如果要取其中 值大于 5 的元素,就可以用上 boolean index 了.

import numpy as np
 
arr = np.array([[1, 2, 3, 4],
                [2, 4, 6, 8],
                [3, 6, 9, 12],
                [4, 8, 12, 16]])
mask = arr > 5
 
print('boolean mask is:')
print(mask)
print(arr[mask])

在这里插入图片描述

二 多维数组array[index,index]和array[index][index]的区别

首先明确:array索引的标准用法是array[index,index]

import numpy as np
a=np.random.randint(0,10,size=[4,5])
a
a[:][0]
a[:,0]

在这里插入图片描述
对于多维数组(超过2),如果索引值只有一个数字,表示一个维度,那就表示对该多维数组的第一个维度进行索引。

import numpy as np
a = np.random.rand(2,2,2,2)
a

在这里插入图片描述
在这里插入图片描述
对于多维数组(超过2),如果索引值有多个数字,表示多个维度,那就表示对该多维数组的对应位置顺序的多个维度同时进行索引。
在这里插入图片描述
以上看不出两者的区别,看下面的示例。
在这里插入图片描述
显然,上面的示例中,a[:][0]表示先取出a数组的所有行,再取出其中的第0行。而a[:,0]表示取出a数组的所有行和第0列。

再看下面的例子
在这里插入图片描述
上面的例子表示对多维数组的最后一个维度进行循环。而下面的例子表示对多维数组的第一个维度进行循环。因为a[:][:][:][c]的前面a[:][:][:]只能表示取出a的所有行,最后a[:][:][:][c]的c才能表示取出a的第一个维度中的第c个。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值