NumPy是一个Python包,它是一个由多维数组对象和用于处理数组的例程集合组成的库。
通过Numpy,可以进行如下操作:
现在一般通过Numpy、Scipy(Scientific Python)和Matplotlib(绘图库)结合来替代MatLab,是一个流行的技术计算平台。
NumPy中定义的最重要的对象是称为ndarray
的N维数组类型,它描述相同类型的元素集合。ndarray对象由计算机内存中的一维连续区域组成,ndarray
中的每个元素在内存中使用相同大小的块。
构造方法:
ndarray
类的实例可以通过后面总结的关于数组的若干方法进行构造。 基本的ndarray
是使用NumPy中的数组函数创建的,如下所示:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
相关参数说明如下:
true
,对象是否被复制,可选。C
(按行)、F
(按列)或A
(任意,默认)。true
,则返回子类。下面我们看一些简单例子:
# 二维数组
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描述了对应于数组固定内存块的解释,包括以下几个方面:
字节顺序取决于数据类型的前缀<
或>
。 <
意味着编码是小端(最小有效字节存储在最小地址中),>
意味着编码是大端(最大有效字节存储在最小地址中)。
numpy.dtype(object, align, copy)
相关参数说明如下:
# 使用数组标量类型
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.]
创建数组
1.numpy.empty
:它创建指定形状和dtype
的未初始化数组。
numpy.empty(shape, dtype = float, order = 'C')
相关参数说明如下:
'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)
相关参数说明如下:
# 将列表转换为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)
相关参数说明如下:
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]]