参考链接: Python中的numpy.compress
Numpy 的主要用途是以数组的形式进行数据操作。 机器学习中大多数操作都是数学操作,而 Numpy 使这些操作变得简单!所以专门学习记录一下numpy是十分有必要的!
1、导库
使用numpy只需要在使用之前导入它的库:
import numpy as np
2、创建数组
我们可以用numpy来创建一系列的数组:
### 通过直接给出的数据创建数组,可以使用 list 或 tuple
### 可以直接指定数组元素的类型
np_array = np.array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
# 输出:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
np_array = np.array([(1.5,2,3), (4,5,6)], dtype=float)
# 输出:
[[1.5 2. 3. ]
[4. 5. 6. ]]
有时数组的内容可能是未知的,但想要初始化一个以后再使用。有许多函数实现。
# 创建一个 3*4 的数组,内容初始化为0
np.zeros((3,4))
# 输出:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
# 创建一个 2*3*4 的数组,内容为1
np.ones((2,3,4), dtype=np.int16)
# 输出:
[[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]
# 创建一个 2*3 的空数组
np.empty((2,3))
# 输出:
[[1.5 2. 3. ]
[4. 5. 6. ]]
也可以使用某些模式创建数组
# 创建一个内容从 10 到 30 的一维数组,间隔为5
np.arange( 10, 30, 5 )
# 输出:
[10 15 20 25]
#创建一个内容从 0 到 2 的一维数组,间隔为0.3
np.arange( 0, 2, 0.3 )
# 输出:
[0. 0.3 0.6 0.9 1.2 1.5 1.8]
#创建一个从 0 到 2 有 9 个等间隔的元素组成的一维数组
np.linspace( 0, 2, 9 )
# 输出:
[0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. ]
3、数组属性
以下属性包含有关数组内存布局的信息:
ndarray.flags 有关阵列内存布局的信息。ndarray.shape 数组维度的元组。ndarray.strides 遍历数组时,每个维度中的字节元组。ndarray.ndim 数组维数。ndarray.data Python缓冲区对象指向数组的数据的开头。ndarray.size 数组中的元素数。ndarray.itemsize 一个数组元素的长度,以字节为单位ndarray.nbytes 数组元素消耗的总字节数。ndarray.base 如果内存来自某个其他对象,则为基础对象。
示例:
ndarray = np.zeros((3,4))
# ndarray.flags 有关阵列内存布局的信息。
print(ndarray.flags)
# 输出:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
# ndarray.shape 数组维度的元组。
print(ndarray.shape)
# 输出:
(3, 4)
# ndarray.strides 遍历数组时,每个维度中的字节元组。
print(ndarray.strides)
# 输出:
(32, 8)
# ndarray.ndim 数组维数。
print(ndarray.ndim)
# 输出:
2
# ndarray.data Python缓冲区对象指向数组的数据的开头。
print(ndarray.data)
# 输出:
<memory at 0x0000000008B682D0>
# ndarray.size 数组中的元素数。
print(ndarray.size)
# 输出:
12
# ndarray.itemsize 一个数组元素的长度,以字节为单位
print(ndarray.itemsize)
# 输出:
8
# ndarray.nbytes 数组元素消耗的总字节数。
print(ndarray.nbytes)
# 输出:
96
# ndarray.base 如果内存来自某个其他对象,则为基础对象。
print(ndarray.base)
# 输出:
None
4、数组方法
一个ndarray对象具有上或与以某种方式在阵列,典型地返回一个数组结果操作的许多方法。下面简要说明这些方法。 对于下面的方法在那里也相应的功能numpy:all,any,argmax, argmin,argpartition,argsort,choose, clip,compress,copy,cumprod, cumsum,diagonal,imag,max, mean,min,nonzero,partition, prod,ptp,put,ravel,real, repeat,reshape,round, searchsorted,sort,squeeze,std, sum,swapaxes,take,trace, transpose,var。
数组转换
ndarray.item(*args) 将数组元素复制到标准Python标量并返回它。ndarray.tolist() 将数组作为(可能是嵌套的)列表返回。ndarray.itemset(*args) 将标量插入数组(如果可能,将标量转换为数组的dtype)ndarray.tostring([order]) 构造包含数组中原始数据字节的Python字节。ndarray.tobytes([order]) 构造包含数组中原始数据字节的Python字节。ndarray.tofile(fid[, sep, format]) 将数组作为文本或二进制写入文件(默认)。ndarray.dump(file) 将数组的pickle转储到指定的文件。ndarray.dumps() 以字符串形式返回数组的pickle。ndarray.astype(dtype[, order, casting, …]) 数组的副本,强制转换为指定的类型。ndarray.byteswap([inplace]) 交换数组元素的字节ndarray.copy([order]) 返回数组的副本。ndarray.view([dtype, type]) 具有相同数据的数组的新视图。ndarray.getfield(dtype[, offset]) 返回给定数组的字段作为特定类型。ndarray.setflags([write, align, uic]) 分别设置数组标志WRITEABLE,ALIGNED,(WRITEBACKIFCOPY和UPDATEIFCOPY)。ndarray.fill(value) 使用标量值填充数组。
形状操作
对于重新n整形,调整大小和转置,单个元组参数可以用将被解释为n元组的整数替换。
ndarray.reshapeshape[, order]) 返回包含具有新形状的相同数据的数组。ndarray.resize(new_shape[, refcheck]) 就地更改阵列的形状和大小。ndarray.transpose(*axes) 返回轴转置的数组视图。ndarray.swapaxes(axis1, axis2) 返回数组的视图,其中axis1和axis2互换。ndarray.flatten([order]) 将折叠的数组的副本返回到一个维度。ndarray.ravel([order]) 返回一个扁平的数组。ndarray.squeeze([axis]) 从形状除去单维输入一个。
项目选择和操作
对于采用axis关键字的数组方法,默认为 None。如果axis为None,则将数组视为1-D数组。轴的任何其他值表示操作应继续进行的维度。
ndarray.take(indices[, axis, out, mode]) 返回由给定索引处的a元素组成的数组。ndarray.put(indices, values[, mode]) 为索引中的所有n设置。a.flat[n] = values[n]ndarray.repeat(repeats[, axis]) 重复数组的元素。ndarray.choose(choices[, out, mode]) 使用索引数组从一组选项中构造新数组。ndarray.sort([axis, kind, order]) 就地对数组进行排序。ndarray.argsort([axis, kind, order]) 返回将对此数组进行排序的索引。ndarray.partition(kth[, axis, kind, order]) 重新排列数组中的元素,使得第k个位置的元素值位于排序数组中的位置。ndarray.argpartition(kth[, axis, kind, order]) 返回将对此数组进行分区的索引。ndarray.searchsorted(v[, side, sorter]) 查找应在其中插入v的元素以维护顺序的索引。ndarray.nonzero() 返回非零元素的索引。ndarray.compress(condition[, axis, out]) 沿给定轴返回此数组的选定切片。ndarray.diagonal([offset, axis1, axis2]) 返回指定的对角线。
5、计算
中许多方法都采用名为axis的参数。在这种情况下,
如果axis为None(默认值),则将数组视为1-D数组,并对整个数组执行操作。如果self是0维数组或数组标量,则此行为也是默认行为。(数组标量是类型/类float32,float64等的实例,而0维数组是包含恰好一个数组标量的ndarray实例。)如果axis是整数,则操作在给定轴上完成(对于可沿给定轴创建的每个1-D子阵列)。
轴参数的示例 尺寸为3 x 3 x 3的三维阵列,在其三个轴中的每个轴上求和:
>>> x
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
>>> x.sum(axis=0)
array([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]])
>>> # for sum, axis is the first keyword, so we may omit it,
>>> # specifying only its value
>>> x.sum(0), x.sum(1), x.sum(2)
(array([[27, 30, 33],
[36, 39, 42],
[45, 48, 51]]),
array([[ 9, 12, 15],
[36, 39, 42],
[63, 66, 69]]),
array([[ 3, 12, 21],
[30, 39, 48],
[57, 66, 75]]))
参数dtype指定应在其上进行缩减操作(如求和)的数据类型。默认的reduce数据类型与self的数据类型相同。为避免溢出,使用更大的数据类型执行缩减可能很有用。
对于多种方法,还可以提供可选的out参数,并将结果放入给定的输出数组中。该出 参数必须是ndarray与具有相同数目的元素。它可以具有不同的数据类型,在这种情况下将执行转换。
ndarray.argmax([axis, out]) 返回给定轴的最大值索引。ndarray.min([axis, out, keepdims]) 沿给定轴返回最小值。ndarray.argmin([axis, out]) 返回最小值的索引沿给定轴线一个。ndarray.ptp([axis, out, keepdims]) 沿给定轴线的峰到峰(最大-最小)。ndarray.clip([min, max, out]) 返回值限制为的数组。[min, max]ndarray.conj() 复合共轭所有元素。ndarray.round([decimals, out]) 返回a,每个元素四舍五入到给定的小数位数。ndarray.trace([offset, axis1, axis2, dtype, out]) 返回数组对角线的总和。ndarray.sum([axis, dtype, out, keepdims]) 返回给定轴上的数组元素的总和。ndarray.cumsum([axis, dtype, out]) 返回给定轴上元素的累积和。ndarray.mean([axis, dtype, out, keepdims]) 返回给定轴上数组元素的平均值。ndarray.var([axis, dtype, out, ddof, keepdims]) 返回给定轴的数组元素的方差。ndarray.std([axis, dtype, out, ddof, keepdims]) 返回给定轴的数组元素的标准偏差。ndarray.prod[axis, dtype, out, keepdims]) 返回给定轴上的数组元素的乘积ndarray.cumprod([axis, dtype, out]) 返回沿给定轴的元素的累积乘积。ndarray.all([axis, out, keepdims]) 如果所有元素都计算为True,则返回True。ndarray.any([axis, out, keepdims]) 如果任何元素,则返回true 一个评估为True。 示例:
# 在 Numpy 中,数组上的算术运算符总是应用在元素上。 填充一个新数组并返回结果。
# 例如,如果创建 a 和 b 2个数组,并从 a 中减去 b,将得到下面的结果
# 不能用不同大小的数组执行类似的操作,否则会出现错误
a = np.array( [20,30,40,50] )
b = np.array( [0, 1, 2, 3] )
c = a - b
c = [20, 29, 38, 47]
# 还可以在整个数组上执行元素的标量操作
b**2
b = [0, 1, 4, 9]
# 甚至应用函数
10*np.sin(a)
a = [ 9.12945251, -9.88031624, 7.4511316 , -2.62374854]
# 请记住两个数组间的操作总是应用在每个元素上的
a = np.array( [20,30,40,50] )
b = np.array( [0, 1, 2, 3] )
c = a * b
c = [0, 30, 80, 150]
# numpy 中有许多快速有用的函数,可以经常使用这些函数
a = np.array( [20,30,40,50] )
a.max() # 50
a.min() # 20
a.sum() # 140
# 如果是多维的数组,可以使用 axis 参数
b = np.arange(12).reshape(3,4)
b = [[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]
b.sum(axis=0) # [12, 15, 18, 21]
b.min(axis=1) # [0, 4, 8]
b.cumsum(axis=1) # [[ 0, 1, 3, 6], [ 4, 9, 15, 22], [ 8, 17, 27, 38]]
# 如果有需要,还有更多的数学函数
b = np.arange(3)
b = [0, 1, 2]
np.exp(b) # [ 1.0, 2.71828183, 7.3890561 ]
np.sqrt(b) # [ 0.0 , 1.0, 1.41421356]
np.floor(np.exp(b)) # [ 1.0, 2.0, 7.0 ]
np.round(np.exp(b)) # [ 1.0, 3.0, 7.0 ]
更多的技巧
### 这些都是可以使用的 Numpy 数据类型
np.int64 # 有符号 64 位 int 类型
np.float32 # 标准双精度浮点类型
np.complex # 由128位的浮点数组成的复数类型
np.bool # TRUE 和 FALSE 的 bool 类型
np.object # Python 中的 object 类型
np.string # 固定长度的 string 类型
np.unicode # 固定长度的 unicode 类型
### Numpy 数组可以像算数那样直接比较
a = np.array([1, 2, 3])
b = np.array([5, 4, 3])
# 如果直接比较会得到每一个元素的 bool 值
a == b # array([False, False, True])
a <= 2 # array([False, True, True])
# 如果要比较整个数组,可以使用 Numpy 内置的函数
np.array_equal(a, b) # False
# 可以以数轴为单位排序
c = np.array([[2, 4, 8], [1, 13, 7]])
c.sort(axis=0) # array([[1, 4, 7], [2, 13, 8]])
c.sort(axis=1) # array([[2, 4, 8], [1, 7, 13]])
### 使用 Numpy 内置函数可以轻松的完成数组处理
# 转置数组
d = np.transpose(c)
# 更改数组的形状
c.ravel() # 可以使数组变成一维数组
c.reshape((3, 2)) # 将数组的形状从 (2, 3) 改为 (3, 2)
# 增加或删除元素
np.append(c, d) # 将 c 中元素添加到 d 数组中
np.insert(a, 1, 5, axis=0) # 在轴 0 的索引 1 处插入 5
np.delete(a,[1], axis=1) # 删除轴 1 索引 1 处的元素
# 合并数组
np.concatenate((c,d),axis=0) # 合并数组 c 和 d 轴 0 上的元素
np.vstack((c,d),axis=0) # 垂直合并数组 c 和 d (行方式)
np.hstack((c,d),axis=0) # 水平合并数组 c 和 d (列方式)
官方文档:https://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html