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

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

  • 一 常规介绍
    • 1 一维数组切片
    • 2 二维数组的切片
    • 3 维数超过 3 的多维数组,可通过 '…' 来简化操作
    • 4 numpy中对切片元素的操作会影响原数组本身
    • 5 array和list的对比
    • 6 boolean/mask index
  • 二 多维数组array[index,index]和array[index][index]的区别

一 常规介绍

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])

numpy.array多维数组的切片操作总结_第1张图片

二 多维数组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]

numpy.array多维数组的切片操作总结_第2张图片
对于多维数组(超过2),如果索引值只有一个数字,表示一个维度,那就表示对该多维数组的第一个维度进行索引。

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

numpy.array多维数组的切片操作总结_第3张图片
numpy.array多维数组的切片操作总结_第4张图片
对于多维数组(超过2),如果索引值有多个数字,表示多个维度,那就表示对该多维数组的对应位置顺序的多个维度同时进行索引。
numpy.array多维数组的切片操作总结_第5张图片
以上看不出两者的区别,看下面的示例。
numpy.array多维数组的切片操作总结_第6张图片
显然,上面的示例中,a[:][0]表示先取出a数组的所有行,再取出其中的第0行。而a[:,0]表示取出a数组的所有行和第0列。

再看下面的例子
numpy.array多维数组的切片操作总结_第7张图片
上面的例子表示对多维数组的最后一个维度进行循环。而下面的例子表示对多维数组的第一个维度进行循环。因为a[:][:][:][c]的前面a[:][:][:]只能表示取出a的所有行,最后a[:][:][:][c]的c才能表示取出a的第一个维度中的第c个。
numpy.array多维数组的切片操作总结_第8张图片

你可能感兴趣的:(数据处理/数据科学/Array,numpy,python,数据分析)