Python] numpy:构建数组、数组属性、改变数组的形状或维度、复制数组、合并数组、分割数组、删除数组以及将数组保存到文件。
Numpy是Python的扩展库(第三方库),支持维度数组和矩阵运算,是运算速度很快的数学库。
Numpy官方文档:NumPy user guide — NumPy v2.0 Manual
帮助:可使用help(...)查看函数说明文档(若是第三方库的函数,需先导入库)。例如:help(np.array)
附:数组array:一维数组、二维数组、更高维度的数组等。
一维数组:(元素数量,),二维数组:(行,列),三维数组:(多少个二维数组或高度,行,列)。
使用pip安装numpy:
pip install numpy
Python代码中,导入numpy:
import numpy as np
1、构建数组:
(1-1)根据已有序列,构建数组
array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0,like=None)
Returns : ndarray
- np.array(序列):其中序列可以是列表、数组、元组等。
(1-2)根据首尾值和步长,构建数组
arange([start,] stop[, step,], dtype=None, *, like=None)
Returns : ndarray
- np.arange(起始值, 结束值, 步长, dtype=元素类型):从起始值(含)开始,到结束值(不含)为止,间隔步长的所有指定类型的值。
- np.arange(值, dtype=元素类型):默认从0(含)开始,到指定值(不含)为止,默认间隔1。
注:若遇到舍入,则影响结束值的大小,元素数量不变。
(1-3)根据首尾值和均分数量,构建数组
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
Returns : ndarray
- np.linspace(起始值, 结束值, 元素数量, dtype=元素类型):从起始值(含)开始,到结束值(含)为止,平分为指定数量且指定类型的值。
注:endpoint可设置是否包含结束值,默认包含,若不包含,可将endpoint=False。
(1-4)构建有值的数组
(1-4-1)所有值为0
zeros(shape, dtype=float, order='C', *, like=None)
Returns : ndarray
- np.zeros(一维的元素数量, dtype=元素类型):指定数量、指定类型且全部为0的一维数组。 默认是浮点数(float64)。
- np.zeros((二维的行数, 二维的列数), dtype=值类型):指定行数列数、指定类型且全部为0的二维数组。 默认是浮点数(float64)。注:用元组形式指定行列数,即 (行数, 列数)。
(1-4-2)所有值为1
zeros(shape, dtype=float, order='C', *, like=None)
Returns : ndarray
- np.ones(...) :与np.zeros(...)用法相同,只是值全部为1。
(1-4-3)所有值为指定值
full(shape, fill_value, dtype=None, order='C', *, like=None)
Returns : ndarray
- np.full(...) :与np.zeros(...)用法相同,只是值全部为人为指定的值。
(1-4-4)所有值为已有内存空间的值
empty(shape, dtype=float, order='C', *, like=None)
Returns : ndarray
- np.empty(...) :与np.zeros(...)用法相同,只是值为内存空间中的值(没有初始化)。
(1-5)通过对行列坐标执行函数,构建数组
fromfunction(function, shape, *, dtype=<class 'float'>, like=None, **kwargs)
- np.fromfunction(函数, 数组形状, 元素类型):将各轴的坐标作为参数传入函数,构建指定形状和指定类型的数组。注:数组形状用元组形式表示。
(1-6)从文件获取,构建数组
- fromfile(file, dtype=float, count=-1, sep='', offset=0, *, like=None)
- load(file, mmap_mode=None, allow_pickle=False, fix_imports=True, encoding='ASCII')
- loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None, *, like=None)
- np.fromfile(...):从文本或二进制文件中获取数据,构建数组。
- np.load(...):从".npy", "npz",或pickled文件中获取数组或pickled对象。
- np.loadtxt(...):从文本文件中获取数据,构建数组。注:每行有相同数量的元素。
- 注:在【8、数组保存到文件】有部分举例。
(1-7)构建特殊数组
(1-7-1)n*n二维数组,对角线为1,其余为0
identity(n, dtype=None, *, like=None)
Returns : ndarray(n*n二维数组,对角线为1,其余为0)
- np.identity(n,dtype=元素类型): 构建n*n二维数组,对角线为1,其余都为0。默认元素类型为浮点数。
(1-7-2)N*M二维数组,对角线为1(对角线索引号可改),其余为0
eye(N, M=None, k=0, dtype=<class 'float'>, order='C', *, like=None)
Returns: ndarray of shape (N,M)
- np.eye(N):构建N行N列的二维数组,对角线为1,其余为0。对角线索引号默认是0。没有M参数,则M=N。
- np.eye(N, M=列数, k=对角线索引号, dtype=元素类型):构建N行M列的二维数组,对角线为1,其余为0。对角线索引号为指定索引号。有M参数,则二维数组形状为(N,M)。
2、数组属性:
- ndim(维度)。
- shape(各维度分别有多少元素)。
- size(共有多少元素)。
- dtype(元素的类型)。
- itemsize(每个元素占多少内存空间)。
- nbytes(共占多少内存空间)
3、数组更改形状或维度:
(3-1)增加一个维度
一维数组:(元素数量,) ----> 二维数组:(行,列)
- 数组[np.newaxis , :]:在第一个维度添加一个轴。一维变二维。
- 数组[: , np.newaxis]:在第二个维度添加一个轴。一维变二维。
二维数组:(行,列) ----> 三维数组:(高度,行,列)
- 数组[np.newaxis , : , :]:在第一个维度添加一个轴。二维变三维。
- 数组[: , np.newaxis , :]:在第二个维度添加一个轴。二维变三维。
- 数组[: , : , np.newaxis]:在第三个维度添加一个轴。二维变三维。
(3-2)指定位置插入轴,来增加一个维度
expand_dims(a, axis)
Returns : ndarray
- np.expand_dims(待更改的数组, axis=指定位置):
(3-3)二维及以上维度数组,转为一维数组
- 多维数组.flatten():多维数组转为一维数组。修改一维数组的值不会影响原多维数组。
- 多维数组.ravel():多维数组转为一维数组。修改一维数组的值也会修改原多维数组。
(3-4)更改数组形状,也可更改数组维度
reshape(a, newshape, order='C')
Returns : ndarray
- np.reshape(待更改的数组, 更改后的形状):更改形状也可更改维度。若一个轴使用-1,则该轴自动调整。
- 也可以:待更改的数组.reshape(更改后的形状)
(3-5)更改数组形状,可转置(行转为列,列转为行)
- np.transpose(二维数组):二维数组行列转置(行转为列,列转为行)。等效于:二维数组.transpose()。
- 二维数组.T:二维数组行列转置。
- np.swapaxes(数组, 0, 1):维数组行列转置。等效于:二维数组.swapaxes(0, 1)。
swapaxes也可将多维数组的两个轴交换。
- np.swapaxes(多维数组, 待交换的轴1, 待交换的轴2):将多维数组的指定的轴1和轴2交换。等效于:二维数组.swapaxes(待交换的轴1, 待交换的轴2)。
4、数组拷贝:
- 通过"="赋值的方式拷贝的数组,和原数组是同一个对象,修改其中一个数组,另一个也会修改。
- 通过"view( )"函数拷贝的数组,和原数组虽不是同一个对象,但它们的base是同一个,修改其中一个数组,另一个也会修改。
- 通过"copy( )"函数拷贝的数组,和原数组是独立的,既不是同一个对象,base也不是同一个,修改其中一个数组,不会影响另一个。
5、数组合并:
(5-1)指定轴合并数组
concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")
Returns : ndarray
- np.concatenate( (数组1, 数组2) ) :两数组维度相同,默认axis=0,即列数相同,上下纵向拼接。
- np.concatenate( (数组1, 数组2), axis=1) :两数组维度相同,行数相同,左右横向拼接。
- np.concatenate( (数组1, 数组2), axis=None) :两数组维度相同,转为一维数组拼接。
(5-2)左右横向合并
hstack(tup)
Returns : ndarray
注:适用于维度最大为3的数组。
- np.hstack( (数组1, 数组2) ) :两数组维度相同,行数相同,左右横向拼接。
(5-3)上下纵向合并
vstack(tup)
Returns : ndarray
注:适用于维度最大为3的数组。
- np.vstack( (数组1, 数组2) ) :两数组维度相同,列数相同,上下纵向拼接。
(5-4)一维数组作为列,合并成二维数组
column_stack(tup)
Returns : 2-D array
注:一维数组都作为列,横向拼接成二维数组。
- np.column_stack( (数组1, 数组2) ) :一维数组,元素数量相同,分别作为列,左右横向拼接。
6、数组拆分
(6-1)指定拆分数量或指定拆分坐标,指定轴拆分
split(ary, indices_or_sections, axis=0)
Returns: list of ndarrays
- np.split(数组, 拆分数量):将数组平均拆分成指定数量的小数组。默认axis=0,即列数不变,行平均拆分。
- np.split(数组, [坐标1, 坐标2, ...]):将数组按指定坐标拆分成多个小数组。默认axis=0,即列数不变,从指定行拆分。坐标从0开始。
(6-2)指定拆分数量或指定拆分坐标,左右横向拆分
hsplit(ary, indices_or_sections)
Returns: list of ndarrays
- np.hsplit(数组, 拆分数量):将数组平均拆分成指定数量的小数组。行数不变,列平均拆分。
- np.hsplit(数组, [坐标1, 坐标2, ...]):将数组按指定坐标拆分成多个小数组。行数不变,从指定列坐标拆分。坐标从0开始。
(6-3)指定拆分数量或指定拆分坐标,上下纵向拆分
vsplit(ary, indices_or_sections)
Returns: list of ndarrays
- np.vsplit(数组, 拆分数量):将数组平均拆分成指定数量的小数组。列数不变,行平均拆分。
- np.vsplit(数组, [坐标1, 坐标2, ...]):将数组按指定坐标拆分成多个小数组。列数不变,从指定行坐标拆分。坐标从0开始。
7、删除数组:del 数组
8、数组保存到文件:
(8-1)数组保存到npy文件(二进制文件)
save(file, arr, allow_pickle=True, fix_imports=True)
- np.save(保存的文件, 数组):将数组保存到npy文件(二进制文件)中。
(8-2)数组保存到文本文件
savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)
- np.savetxt(保存的文件, 数组, fmt=数值格式):将数组保存到文本文件中。
补充:np.zeros_like(...)、np.ones_like(...)、np.full_like(...)和np.empty_like(...)
zeros_like(a, dtype=None, order='K', subok=True, shape=None)
Returns : ndarray
ones_like(a, dtype=None, order='K', subok=True, shape=None)
Returns : ndarray
full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None)
Returns : ndarray
empty_like(prototype, dtype=None, order='K', subok=True, shape=None)
Returns : ndarray
上一篇: Java 中的线程池调整和性能提升技巧
下一篇: 围棋面试问题第3天