使用 NumPy 库需先导入 numpy 模块,习惯性,我们将导入后的模块重新命名为 np。
import numpy as np
下面,我们主要学习 numpy 中的两种数据结构
有以下多种常用的创建数组对象的方法:
>>> np.array([1,2,3,4])
array([1, 2, 3, 4])
>>> np.arange(3)
array([0, 1, 2])
>>> np.arange(3.0)
array([ 0., 1., 2.])
>>> np.arange(3,7)
array([3, 4, 5, 6])
>>> np.arange(3,7,2)
array([3, 5])
>>> np.ones(5)
array([1., 1., 1., 1., 1.])
>>> np.ones((5,), dtype=int)
array([1, 1, 1, 1, 1])
>>> np.zeros((2, 1))
array([[ 0.],
[ 0.]])
>>> s = (2,2)
>>> np.zeros(s)
array([[ 0., 0.],
[ 0., 0.]])
>>> np.empty([2, 2])
array([[ -9.74499359e+001, 6.69583040e-309],
[ 2.13182611e-314, 3.06959433e-309]]) #uninitialized
>>> np.empty([2, 2], dtype=int)
array([[-1073741821, -1067949133],
[ 496041986, 19249760]]) #uninitialized
>>> np.random.rand(3,2)
array([[ 0.14022471, 0.96360618], #random
[ 0.37601032, 0.25528411], #random
[ 0.49313049, 0.94909878]]) #random
>>> np.linspace(2.0, 3.0, num=5)
array([2. , 2.25, 2.5 , 2.75, 3. ])
>>> np.linspace(2.0, 3.0, num=5, endpoint=False)
array([2. , 2.2, 2.4, 2.6, 2.8])
>>> np.linspace(2.0, 3.0, num=5, retstep=True)
(array([2. , 2.25, 2.5 , 2.75, 3. ]), 0.25)
这里我们和 python 列表(List)一样,分为“索引”和“切片”两块介绍。
以二维数组 array 和三维数组 array2 为例,我们先创建这个两个数组。(后面的内容也需要用到这两个数组)
>>> array = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
>>> array2 = np.array([[[1,2,3,4],[5,6,7,8],[9,10,11,12]],
[[9,10,11,12],[5,6,7,8],[1,2,3,4]]])
方法一:和列表一样的索引方式
>>> array[2]
array([ 9, 10, 11, 12])
>>> array[2][2]
11
方法二:Ndarray 独有的索引方式,在中括号中,用逗号隔开对不同维数的索引。
>>> array[2,2]
11
>>> array2[0,2]
array([ 9, 10, 11, 12])
一维数组索引: 一维数组的切片操作和 python 的列表一样。
>>> a = np.arange(5)
>>> a[:2]
array([0, 1])
多维数组索引: 用逗号隔开不同维数的切片,其余格式和一维数组索引一样。(位于后面的维数如果不需要索引的话可以不写)
>>> array[1:3,2:4]
array([[ 7, 8],
[11, 12]])
>>> array2[:,1:]
array([[[ 5, 6, 7, 8],
[ 9, 10, 11, 12]],
[[ 5, 6, 7, 8],
[ 1, 2, 3, 4]]])
我们将数组的索引、切片写在等号左侧,可对数组进行部分赋值。
>>> array[0:2,0:2] = [[0,1],[2,3]]
>>> array
array([[ 0, 1, 3, 4],
[ 2, 3, 7, 8],
[ 9, 10, 11, 12]])
>>> array[2][2] = 100
>>> array
array([[ 0, 1, 3, 4],
[ 2, 3, 7, 8],
[ 9, 10, 100, 12]])
shape 属性:数组的结构(返回一个整数元组,表示数组各个维度的长度)
dtype 属性:数组元素的数据类型(返回 numpy.dtype 对象,表示数据类型)
size 属性:数组含有元素个数(返回 int 对象,表述数组含有数据的个数)
itemsize 属性:数组元素数据类型所占字节数(返回 int 对象)
ndim 属性:数组维度(返回 int 对象)
>>> for s in ['shape','dtype','size','itemsize','ndim']:
print(s,':\t',str(eval('array.'+s)))
shape : (3, 4)
dtype : int32
size : 12
itemsize : 4
ndim : 2
可能被修饰为属性的方法:
T 属性:返回数组的转置
>>> array3 = array.reshape(2,-1)
>>> array3
array([[ 1, 2, 3, 4, 5, 6],
[ 7, 8, 9, 10, 11, 12]])
>>> array3 = np.append(array,[[1],[2],[3]],axis=1)
>>> array4 = np.append([[1,2],[3,4]],[[1],[2]])
>>> array5 = np.append(array2,array2,0)
>>> print(array3,array4,array5,sep='\n————————\n')
[[ 1 2 3 4 1]
[ 5 6 7 8 2]
[ 9 10 11 12 3]]
————————
[1 2 3 4 1 2]
————————
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 9 10 11 12]
[ 5 6 7 8]
[ 1 2 3 4]]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 9 10 11 12]
[ 5 6 7 8]
[ 1 2 3 4]]]
>>> np.delete(array, 1, 0)
array([[ 1, 2, 3, 4],
[ 9, 10, 11, 12]])
>>> np.delete(array, np.s_[::2], 1)
array([[ 2, 4],
[ 6, 8],
[10, 12]])
>>> np.delete(array, [1,3,5], None)
array([ 1, 3, 5, 7, 8, 9, 10, 11, 12])
>>> np.append([[1,2]],[[3,4]],0)
array([[1, 2],
[3, 4]])
>>> np.vstack(([1,2],[3,4]))
array([[1, 2],
[3, 4]])
>>> np.hstack(([1,2],[3,4],[5]))
array([1, 2, 3, 4, 5])
>>> np.mat(np.ones((3,3),int))
matrix([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
>>> np.mat([0])
matrix([[0]])
和数组完全一致。
shape 属性:返回一个元组,包含矩阵的行数、列数。
size 属性:返回一个整数,代表矩阵内元素的个数。
dtype 属性:返回 numpy.dtype 对象,代表矩阵内元素的类型。
>>> array = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
>>> matrix = np.mat(array)
>>> for x in ['shape','size','dtype']:
print(x,':',str(eval('matrix.'+x)))
shape : (3, 4)
size : 12
dtype : int32
可能被修饰为属性的方法:
T 属性:返回矩阵的转置
>>> matrix.tolist()
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
# 仍用上面的 matrix 矩阵
>>> np.delete(matrix,1,0)
matrix([[ 1, 2, 3, 4],
[ 9, 10, 11, 12]])
>>> np.delete(matrix,(1,3,5,7))
matrix([[ 1, 3, 5, 7, 9, 10, 11, 12]])
>>> array = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
>>> matrix = np.mat(array)
>>> np.c_[matrix,array,[[1],[2],[3]]]
matrix([[ 1, 2, 3, 4, 1, 2, 3, 4, 1],
[ 5, 6, 7, 8, 5, 6, 7, 8, 2],
[ 9, 10, 11, 12, 9, 10, 11, 12, 3]])
>>> mat1 = np.mat([1,2,3])
>>> mat1.T * mat1
matrix([[1, 2, 3],
[2, 4, 6],
[3, 6, 9]])
>>> mat1.dot(mat1.T)
matrix([[14]])
>>> mat2 = np.mat([[1,2],[3,4]])
>>> np.linalg.inv(mat2)
matrix([[-2. , 1. ],
[ 1.5, -0.5]])
>>> np.linalg.inv([[0,1],[0,0]])
Traceback (most recent call last):
File "" , line 1, in <module>
np.linalg.inv([[0,1],[0,0]])
File "<__array_function__ internals>", line 6, in inv
File "D:\py\lib\site-packages\numpy\linalg\linalg.py", line 547, in inv
ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)
File "D:\py\lib\site-packages\numpy\linalg\linalg.py", line 97, in _raise_linalgerror_singular
raise LinAlgError("Singular matrix")
numpy.linalg.LinAlgError: Singular matrix
>>> np.linalg.eig([[1,2],[2,1]])
(array([ 3., -1.]), array([[ 0.70710678, -0.70710678],
[ 0.70710678, 0.70710678]]))
'''此处特征值 3 对应的标准化特征向量为 (0.7071,0.7071)'''