python的NumPy使用

2021-01-04 10:13:11 浏览数 (1)

参考链接: 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

0 人点赞