Loading

Python——Numpy数组

数组的定义

NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。

ndarray 对象是用于存放同类型元素的多维数组。

ndarray 中的每个元素在内存中都有相同存储大小的区域。

创建一个 ndarray 只需调用 NumPy 的 array 函数即可:

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

参数说明:

名称 描述
object 数组或嵌套的数列
dtype 数组元素的数据类型,可选
copy 对象是否需要复制,可选
order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok 默认返回一个与基类类型一致的数组
ndmin 指定生成数组的最小维度

数组的属性

属性 说明
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 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

数组的创建方式

  • numpy.empty(shape, dtype = float, order = 'C') 创建一个未初始化的数值
    order有两个选项:"C"和"F";分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。

  • numpy.zeros(shape, dtype = float, order = 'C') 创建指定大小的数组,数组元素以 0 来填充
    order有两个选项:'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组

  • numpy.ones(shape, dtype = None, order = 'C') 创建指定形状的数组,数组元素以 1 来填充

  • numpy.asarray(a, dtype = None, order = None)
    numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个。
    a可以是任意行事的输入,例如列表,元组,多维数组

  • numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
    numpy.frombuffer 用于实现动态数组。
    numpy.frombuffer 接受 buffer 输入参数,以流的形式读入转化成 ndarray 对象。
    buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。

    count读取的数据数量,默认为-1,读取所有数据。offset读取的起始位置,默认为0。

    import numpy as np 
     
    s =  b'Hello World' 
    a = np.frombuffer(s, dtype =  'S1')  
    print (a)
    

image

  • numpy.fromiter(iterable, dtype, count=-1) numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。

    import numpy as np 
     
    # 使用 range 函数创建列表对象  
    list=range(5)
    it=iter(list)
     
    # 使用迭代器创建 ndarray 
    x=np.fromiter(it, dtype=float)
    print(x)
    

image

  • numpy.arange(start, stop, step, dtype) 根据 start 与 stop 指定的范围以及 step 设定的步长,生成一个 ndarray。
    start起始值,默认为0;stop终止值(不包含);step步长,默认为1

  • np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 创建一个一维数组,数组是一个等差数列构成的
    num要生成的等步长的样本数量,默认为50;endpoint该值为 true 时,数列中包含stop值,反之不包含,默认是True。;retstep如果为 True 时,生成的数组中会显示间距,反之不显示。

  • np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None) 创建一个等比数列
    base对数 log 的底数。

数组的索引方法

简单的方法就是利用下标,例如array[1:5]这类的方法

常见的数据操作

  1. numpy.reshape(arr, newshape, order='C') 在不改变数据的条件下 修改数组的形状

  2. ndarray.flat 数组元素迭代器

    import numpy as np
    a = np.arange(9).reshape(3,3)
    for element in a:
    	print(element)
    for element in a.flat:
    	print(element)
    

image

  1. ndarray.flatten(order='C') 返回一份数组拷贝, 对拷贝所做的修改不会影响原始数据
    order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'K' -- 元素在内存中的出现顺序。

    import numpy as np
    a = np.arange(9).reshape(3,3)
    print(a)
    print(a.flatten())
    print(a.flatten(order='F'))
    print(a.flatten(order='A'))
    print(a.flatten(order='K'))
    

image

  1. numpy.ravel(a, order='C') 返回展开数组。返回的是一个视图,对其操作会对原始数据有影响

    import numpy as np
    a = np.arange(8).reshape(2,4)
    print (a)
    print (a.ravel())
    print (a.ravel(order = 'F'))
    

    image

  2. numpy.transpose(arr, axes) 用于对换数组的维度
    arr:要操作的数组;axes:整数列表,对应维度,通常所有维度都会对换。

  3. numpy.expand_dims(arr, axis) 通过在指定位置插入新的轴来扩展数组形状
    arr:输入数组; axis:新轴插入的位置

    import numpy as np
    x = np.array(([1,2],[3,4]))
    print(x.shape)
    x = np.expand_dims(x, 1)
    print(x.shape)
    

    image

  4. numpy.squeeze(arr, axis)从给定数组的形状中删除一维的条目

    import numpy as np
    x = np.arange(20).reshape(2,1,2,5)
    print(x.shape)
    x = np.squeeze(x)
    print(x.shape)
    

    image
    注意 不表明维度的情况下,squeeze会自动压缩维度大小为1的维度。如果需要压缩的维度大小不为1,回报错的。

  5. numpy.concatenate((a1, a2, ...), axis) 用于沿指定轴连接相同形状的两个或多个数组

  6. numpy.stack(arrays, axis) 用于沿新轴连接数组序列

  7. numpy.split(ary, indices_or_sections, axis) 沿特定的轴将数组分割为子数组
    indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)

  8. numpy.array_split(ary, indices_or_sections, axis) 可以不规则的切分数组。 split要求对数据均匀切分,而array_split可以切分成不同的形状

  9. numpy.append(arr, values, axis=None)在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中。

  10. numpy.insert(arr, obj, values, axis)在给定索引之前,沿给定轴在输入数组中插入值。

  11. numpy.delete(arr, obj, axis) 返回从输入数组中删除指定子数组的新数组

  12. numpy.unique(arr, return_index, return_inverse, return_counts)用于去除数组中的重复元素return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储; return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储; return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数

  13. numpy.clip(array, min, max) 使数组数值在上下限范围内

  14. np.trim_zeros(array) 除去数组中前面和后面的0

  15. np.full(size, data, dtype) 以data填入size形成一个array

数据分布

  1. np.arange:从范围内选取所有整数(左闭右开)

  2. numpy.random.choice 从一定范围内随机选取几个

  3. numpy.random.uniform 均匀分布

  4. numpy.random.randn 正态分布

  5. numpy.random.random 随机数 浮点数

  6. numpy.random.rand 0-1分布 随机数

  7. numpy.random.choice(a, size=None, replace=True, p=None)
    从a(只要是ndarray都可以,但必须是一维的)中随机抽取数字,并组成指定大小(size)的数组
    replace:True表示可以取相同数字,False表示不可以取相同数字
    数组p:与数组a相对应,表示取数组a中每个元素的概率,默认为选取每个元素的概率相同。

  8. 随机数,可以直接调用np.random.rand()
    但是设定一个随机种子np.random.seed(),你可以实现每次获取相同的随机数

  9. np.random.permutation()随机排列序列 效果同shuflle 内部调用了shuffle

    shuffle 的参数只能是 array_like,而 permutation 除了 array_like 还可以是 int 类型,如果是 int 类型,那就随机打乱 numpy.arange(int)。

    shuffle 返回 None,这点尤其要注意,也就是说没有返回值,而 permutation 则返回打乱后的 array。

检查元素 判断 及集合操作

  • np.any() 是否有假
  • np.all() 是否全为真
  • np.inld(array1, array2) 判断2是否是1的子集
  • np.intersection() 输出的数据则是不重复的
  • np.setdiff1d() 与in1d()相反,寻找与y不同的数值
  • np.setxor1d() 寻找只在x或者y中存在的数据 并输出
  • np.union1d() 寻找共同子集
  • np.correlate() 两个序列的相关性

tips

  1. 行向量或者一维向量没有办法直接转置,转置后一维向量应该是二维,但是直接使用transpose是没有办法达到的
    所以我们需要对维度下刀image

  2. np.bincount(array, weights, minlength) 数组内数字统计
    weight是指数据的权重,默认权重为1,minlength指的是array的值域大小,当值域不满足minlength时,后面默认补0.

  3. np.astype 可以转换数组值 数据类型

posted @ 2022-02-23 16:08  Christopher·阳  阅读(305)  评论(0编辑  收藏  举报