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)
-
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)
-
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]
这类的方法
常见的数据操作
-
numpy.reshape(arr, newshape, order='C')
在不改变数据的条件下 修改数组的形状 -
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)
-
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'))
-
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'))
-
numpy.transpose(arr, axes)
用于对换数组的维度
arr:要操作的数组;axes:整数列表,对应维度,通常所有维度都会对换。 -
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)
-
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)
注意 不表明维度的情况下,squeeze会自动压缩维度大小为1的维度。如果需要压缩的维度大小不为1,回报错的。 -
numpy.concatenate((a1, a2, ...), axis)
用于沿指定轴连接相同形状的两个或多个数组 -
numpy.stack(arrays, axis)
用于沿新轴连接数组序列 -
numpy.split(ary, indices_or_sections, axis)
沿特定的轴将数组分割为子数组
indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭) -
numpy.array_split(ary, indices_or_sections, axis)
可以不规则的切分数组。 split要求对数据均匀切分,而array_split可以切分成不同的形状 -
numpy.append(arr, values, axis=None)
在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中。 -
numpy.insert(arr, obj, values, axis)
在给定索引之前,沿给定轴在输入数组中插入值。 -
numpy.delete(arr, obj, axis)
返回从输入数组中删除指定子数组的新数组 -
numpy.unique(arr, return_index, return_inverse, return_counts)
用于去除数组中的重复元素return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储; return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储; return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数 -
numpy.clip(array, min, max)
使数组数值在上下限范围内 -
np.trim_zeros(array)
除去数组中前面和后面的0 -
np.full(size, data, dtype)
以data填入size形成一个array
数据分布
-
np.arange
:从范围内选取所有整数(左闭右开) -
numpy.random.choice
从一定范围内随机选取几个 -
numpy.random.uniform
均匀分布 -
numpy.random.randn
正态分布 -
numpy.random.random
随机数 浮点数 -
numpy.random.rand
0-1分布 随机数 -
numpy.random.choice(a, size=None, replace=True, p=None)
从a(只要是ndarray都可以,但必须是一维的)中随机抽取数字,并组成指定大小(size)的数组
replace:True表示可以取相同数字,False表示不可以取相同数字
数组p:与数组a相对应,表示取数组a中每个元素的概率,默认为选取每个元素的概率相同。 -
随机数,可以直接调用
np.random.rand()
但是设定一个随机种子np.random.seed()
,你可以实现每次获取相同的随机数 -
np.random.permutation()
随机排列序列 效果同shuflle 内部调用了shuffleshuffle 的参数只能是 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
-
行向量或者一维向量没有办法直接转置,转置后一维向量应该是二维,但是直接使用transpose是没有办法达到的
所以我们需要对维度下刀 -
np.bincount(array, weights, minlength)
数组内数字统计
weight是指数据的权重,默认权重为1,minlength指的是array的值域大小,当值域不满足minlength时,后面默认补0. -
np.astype
可以转换数组值 数据类型
有时会发现学习是一件很快乐的事情 比一直跑步容易多了 不是嘛