Python-Numpy详解

一、初识Numpy

NumPy是一个Python包,它是一个由多维数组对象和用于处理数组的例程集合组成的库。

通过Numpy,可以进行如下操作:

  1. 数组的算数和逻辑运算。
  2. 傅立叶变换和用于图形操作的例程。
  3. 与线性代数有关的操作,NumPy 拥有线性代数和随机数生成的内置函数。

现在一般通过Numpy、Scipy(Scientific Python)和Matplotlib(绘图库)结合来替代MatLab,是一个流行的技术计算平台。

二、Ndarray对象

NumPy中定义的最重要的对象是称为ndarray的N维数组类型,它描述相同类型的元素集合。ndarray对象由计算机内存中的一维连续区域组成,ndarray中的每个元素在内存中使用相同大小的块。

构造方法:

ndarray类的实例可以通过后面总结的关于数组的若干方法进行构造。 基本的ndarray是使用NumPy中的数组函数创建的,如下所示:

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

相关参数说明如下:

  1. object:任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。
  2. dtype:数组的所需数据类型,可选。
  3. copy:默认为true,对象是否被复制,可选。
  4. order:C(按行)、F(按列)或A(任意,默认)。
  5. subok:默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类。
  6. ndmin:指定返回数组的最小维数。

下面我们看一些简单例子:

# 二维数组
import numpy
array = numpy.array([[1,2,3],[4,5,6]])
print(array)
# [[1 2 3]
#  [4 5 6]]
# dtype为复数
import numpy
array = numpy.array([1,2,3],dtype=complex)
print(array)
# [1.+0.j 2.+0.j 3.+0.j]

数组属性:

ndarray.shape:这一数组属性返回一个包含数组维度的元组,它也可以用于调整数组大小。

import numpy
a = numpy.array([[1,2,3],[4,5,6]])
print(a.shape)
# (2, 3)
# 调整数组大小
import numpy
a = numpy.array([[1, 2, 3], [4, 5, 6]])
a.shape = (3, 2)
print(a)
# [[1 2]
#  [3 4]
#  [5 6]]
# 可以通过reshape函数调整大小
import numpy
a = numpy.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print(b)

ndarray.ndim:这一数组属性返回数组的维数。

# 一维数组
import numpy
a = numpy.arange(24)
print(a.ndim) # 1
# 现在调整其大小
b = a.reshape(6,2,2)
print(b.ndim) # 3
# b现在拥有三个维度

numpy.itemsize:这一数组属性返回数组中每个元素的字节单位长度。

# 数组的dtype为float32(四个字节)
import numpy
x = numpy.array([1,2,3,4,5], dtype = numpy.float32)
print(x.itemsize)
# 4

三、数据类型对象dtype

数据类型对象dtype描述了对应于数组固定内存块的解释,包括以下几个方面:

  1. 数据类型(整数、浮点或者Python对象)。
  2. 数据大小。
  3. 字节序(小端或大端)。
  4. 在结构化类型的情况下,字段的名称,每个字段的数据类型,和每个字段占用的内存块部分。
  5. 如果数据类型是子序列,它的形状和数据类型。

字节顺序取决于数据类型的前缀<>。 <意味着编码是小端(最小有效字节存储在最小地址中),>意味着编码是大端(最大有效字节存储在最小地址中)。

numpy.dtype(object, align, copy)

相关参数说明如下:

  1. object:被转换为数据类型的对象。
  2. align:如果为true,则向字段添加间隔,使其类似C的结构体。
  3. copy:生成dtype对象的新副本,如果为false,结果是内建数据类型对象的引用。
# 使用数组标量类型
import numpy
dt = numpy.dtype(numpy.int32)
print(dt)
# int32
# int8,int16,int32,int64可替换为等价的字符串'i1','i2','i4','i8'
import numpy as np
dt = np.dtype('i8')
print(dt)
# int64
import numpy
dt = numpy.dtype([('age',numpy.int8)]) # 创建结构化数据类型
print(dt) 
# [('age', 'i1')]
a = numpy.array([(10,),(20,),(30,)], dtype = dt) # 现在将其应用于ndarray对象
print(a)
# [(10,) (20,) (30,)]
print(a['age'])
# [10 20 30]
import numpy
# 定义名为student的结构化数据类型,其中包含字符串字段name,整数字段age和浮点字段marks。 
# 并将此dtype应用于ndarray对象。
student = numpy.dtype([('name', 'S20'), ('age', 'i1'), ('marks', 'f4')])
a = numpy.array([('abc', 21, 50), ('xyz', 18, 75)], dtype=student)
print(a)
# [('abc', 21, 50.) ('xyz', 18, 75.)]
print(a['name'])
# ['abc' 'xyz']
print(a['age'])
# [21 18]
print(a['marks'])
# [50. 75.]

四、用Numpy操作数组

创建数组

1.numpy.empty:它创建指定形状和dtype的未初始化数组。

numpy.empty(shape, dtype = float, order = 'C')

相关参数说明如下:

  1. shape:空数组的形状,整数或整数元组。
  2. dtype:所需的输出数组类型,可选。
  3. order:'C'为按行的C风格数组,'F'为按列的Fortran风格数组。
import numpy
x = numpy.empty([3,2], dtype = int)
print(x)
# [[1890908336      32761]
#  [1890912960      32761]
#  [         0          0]]

其中,数组元素为随机值,因为它们未初始化。

2.numpy.zeros:返回特定大小,以0填充的新数组。

numpy.zeros(shape, dtype = float, order = 'C')

相关参数说明同上。

# 含有5个0的数组,默认类型为float  
import numpy
x = numpy.zeros(5)  
print(x)
# [0. 0. 0. 0. 0.]
import numpy
x = numpy.zeros((5,), dtype = numpy.int)
print(x)
# [0 0 0 0 0]
# 自定义类型
import numpy
x = numpy.zeros((2,2), dtype =  [('x',  'i1'),  ('y',  'i1')])
print(x)
# [[(0, 0) (0, 0)]
#  [(0, 0) (0, 0)]]

3.numpy.ones:返回特定大小,以1填充的新数组。

numpy.ones(shape, dtype = None, order = 'C')

相关参数说明同上。

import numpy
x = numpy.ones([2,2], dtype = int)
print(x)
# [[1 1]
#  [1 1]]

4.numpy.asarray:此函数类似于numpy.array,这个例程对于将Python序列转换为ndarray非常有用。

numpy.asarray(a, dtype = None, order = None)

相关参数说明如下:

  1. a:任意形式的输入参数,比如列表、列表的元组、元组、元组的元组、元组的列表。
  2. dtype:通常,输入数据的类型会应用到返回的ndarray。
  3. order:'C'为按行的C风格数组,'F'为按列的Fortran风格数组。
# 将列表转换为ndarray
import numpy as np
x = [1, 2, 3]
a = np.asarray(x)
print(a)
# [1 2 3]
import numpy as np
x = [1, 2, 3]
a = np.asarray(x,dtype=float)
print(a)
# [1. 2. 3.]
# 来自元组列表的 ndarray
import numpy as np
x = [(1, 2, 3), (4, 5)]
a = np.asarray(x)
print(a)
# [(1, 2, 3) (4, 5)]

numpy.arange:这个函数返回ndarray对象,包含给定范围内的等间隔值。

numpy.arange(start, stop, step, dtype)

相关参数说明如下:

  1. start:范围的起始值,默认为0.
  2. stop:范围的终止值(不包含)。
  3. step:两个值的间隔,默认为1。
  4. dtype:返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。
import numpy as np
# 设置了 dtype
x = np.arange(5, dtype =  float)  
print x
# [0. 1. 2. 3. 4.]
# 设置了起始值和终止值参数  
import numpy as np
x = np.arange(10,20,2)  
print(X)
# [10  12  14  16  18]

数组的索引和切片

一维数组的索引和切片:

import numpy
arr = numpy.arange(10)
print(arr)
# [0 1 2 3 4 5 6 7 8 9]
print(arr[1:8])
# [1 2 3 4 5 6 7]
print(arr[:8:3])
# [0 3 6]
print(arr[::-1])
# [9 8 7 6 5 4 3 2 1 0]

多维数组的索引和切片:

import numpy
arr = numpy.arange(16).reshape(2,4,2)
print(arr)
# [[[ 0  1]
#   [ 2  3]
#   [ 4  5]
#   [ 6  7]]
#
#  [[ 8  9]
#   [10 11]
#   [12 13]
#   [14 15]]]
print(arr[0,0,0])
# 0
print(arr[1,3,1])
# 15
print(arr[:,0,0])
# [0 8]
print(arr[0])
#[[0 1]
# [2 3]
# [4 5]
# [6 7]]
print(arr[0,:,:]) # 效果同上
print(arr[0,...]) # 效果同上
print(arr[0, :, 1])
# [1 3 5 7]
print(arr[0, :, -1])
# [1 3 5 7]
print(arr[0, ::-1, -1])
# [7 5 3 1]
print(arr[0, ::2, -1])
# [1 5]
print(arr[::-1])
#[[[ 8  9]
#  [10 11]
#  [12 13]
#  [14 15]]
#
# [[ 0  1]
#  [ 2  3]
#  [ 4  5]
#  [ 6  7]]]

花式索引:

import numpy
arr = numpy.empty((5, 3))
for i in range(5):
    arr[i] = i
print(arr)
# [[0. 0. 0.]
#  [1. 1. 1.]
#  [2. 2. 2.]
#  [3. 3. 3.]
#  [4. 4. 4.]]
print(arr[[3,1,2,0]]) #以第3,1,2,0行的顺序选取子集,从0开始计数
# [[3. 3. 3.]
#  [1. 1. 1.]
#  [2. 2. 2.]
#  [0. 0. 0.]]
print(arr[[-2,-3,-1]]) #以倒数第2,3,1行顺序选取子集,负数是从-1开始计数
# [[3. 3. 3.]
#  [2. 2. 2.]
#  [4. 4. 4.]]

数组运算

import numpy
arr1 = numpy.array([[2,1],[1,2]])
arr2 = numpy.array([[1,2],[3,4]])
print(arr1 - arr2)
# [[ 1 -1]
#  [-2 -2]]

print(arr1**2)
# [[4 1]
#  [1 4]]

print(3*arr2)
# [[ 3  6]
#  [ 9 12]]

print(arr1*arr2)  # 普通乘法
# [[2 2]
#  [3 8]]

print(numpy.dot(arr1,arr2))  # 矩阵乘法
# [[ 5  8]
#  [ 7 10]]

print(arr2.T)  #矩阵转置
# [[1 3]
#  [2 4]]

print(numpy.linalg.inv(arr2)) # 返回逆矩阵
# [[-2.   1. ]
#  [ 1.5 -0.5]]

print(arr2.sum())  # 数组元素求和
# 10
print(arr2.max())  # 返回数组最大元素
# 4

# 如果是一维数组,就是当前列之前的和加到当前列上
# 如果是二维数组,axis可以是0(第一行不动,其他行累加), 可以是1(第一列列不动,其他列累加)
print(arr2.cumsum(axis = 1))
# [[1 3]
#  [3 7]]

 

 

 

你可能感兴趣的:(深度学习)