Numpy的数组(矩阵),取值

Numpy

Posted by 祝化林 on February 27, 2019

简介

NumPy 数组的维数称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推。 在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。 很多时候可以声明 axis。axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。

属性 说明
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息
ndarray.real ndarray元素的实部
ndarray.imag ndarray 元素的虚部
ndarray.data 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

linspace 等差

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
 # 等差数列
    # 样本在1 ~ 50之间
    # 10 表示样本的个数
    # False 表示是否包含最后一个元素, 即是否包含50这个数
    # True 是否显示步长 当显示步长的时候返回的是Tuple
    x = np.linspace(1,50,10,False,False).reshape([2,5])

当要显示步长的时候 返回的是一个Tuple 类型。此时不能,使用reshape,来生成矩阵 这是输出

[[ 1.   5.9 10.8 15.7 20.6]
 [25.5 30.4 35.3 40.2 45.1]]

logspace 等比

np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

比如

    # 1.0 开始是从 base = 10 10的1次方
    # 4.0 结束是从 base的4次方结束
    a = np.logspace(1.0, 4.0, num=10,endpoint=True,base=2)
    print(a)

默认 base 是10 ,start 和 end 都是 base的指数, 从base 2的 1次方到4 次方,按照等比的形式,生成num = 10个数

取值

索引

有两个参数 […,a] 表示取 第 a列 [a,…] 表示取 第 a行 [a:,…] 表示取 第 a行之后的所有 包含第a 行 [:a,…] 表示取 第 a行之前的所有 不包含第a 行 [a,b] 表示取第a行b列的指定元素

    a = np.array([[1,2,3],[4,5,6],[7,8,9]])
    print(a)
    b = a[1:]
    print('分割线')
    print(b)
    print('分割线')

    # 第一个参数表示的是行
    # 第二个参数表示的列,数字表示第几列
    print(a[...,0])
    print('分割线')

    print(a[..., 1])
    print('分割线')
    print(a[..., 2])
    print('分割线')

    print(a[0, ...])
    print('分割线')

    # 1: 表示第n+1行以及以下的所有
    print(a[1:, ...])
    print('分割线')
    print(a[2, ...])
    print('分割线')
    
    # 指定某个具体的元素
    print(a[2,1])

高级索引

    x = np.array([[1,2],[3,4],[5,6]])
    y = x[[0,1,2],[0,1,1]]

x 为一个3*2矩阵

[[0,1,2],[0,1,1]] 可以理解为一个下面的矩阵

对应的点为

(0,0),(1,1),(2,1)

y即为x中对应的点的ndarray,即为

[1,3,5]

再比如

x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
    print('我们的数组是:')
    print(x)
    print('\n')
    rows = np.array([[0, 0], [3, 3]])
    cols = np.array([[0, 2], [0, 2]])
    y = x[rows, cols]

x 为一个 3*3 数组:

rowclo组成了一个矩阵 第一行 row1的两个点为

[(0,0),(0,2)]

第二行 row2的两个点为

[(3,0),(3,2)]

对应 3*3矩阵中的元素,即为,四个角标

借住切片 : 或者...,与索引数组组合

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

展示的是一个数组

a[1:3,1:3]
表示截取 矩阵a中,row从1-3,col 也是1-3,左闭右开
a[1:3,1,2]
表示截取 矩阵a中,row从1-3,col 是 1和 2,是一个数组,不是一个区间,
a[...,1:]
表示截取 矩阵a中,row从1-3,col 是 1和 2,是一个数组,不是一个区间,
... 表示所有行,1: 表示从1列到最后

BOOL 索引

我们可以通过一个布尔数组来索引目标数组,布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

def boolSy():
    a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    print('我们的数组')
    print(a)
    print(a[a > 5])
    // 输出
    [6 7 8 9]

返回,满足条件的元素组成的数组

花式索引

x=np.arange(32).reshape((8,4))
print (x[[4,2,1,7]])
这个返回的是,row = ,4,5,1,7 的行
如果print(x[[4, 2, 1, 7],[1,1,1,1]])
返回的是一个一位数组,为两个数组对应的元素

有个精彩的地方

a = x[[4, 2, 1, 7],[1,1,1,1]]
b = x[np.ix_([1,5,7,2],[0,3,1,2])]

这两个看着很一样,但是却有很多差别 拿下面的矩阵举例

a = x[[1,2,0],[0,2,1]]
b = x[np.ix_([1,2,0],[0,2,1])]

a 表示的是取(1,0),(2,2),(0,1) 对应的元素, 即[4,9,2] b 表示的是取 1,2,0行,变成如下,

然后纵坐标按照[0,2,1]为