Numpy的核心array对象以及创建array的方法
array对象的背景:
Numpy的核心数据结构,就叫做array就是数组,array对象可以是一维数组,也可以是多维数组
Python的List也可以实现相同的功能,但是array比List的优点在于性能好、包含数组元数据信息、大量的便捷函数
Numpy成为事实上的Scipy、Pandas、Scikit-Learn、Tensorflow等框架的“通用底层语言”
Numpy的array和Python的List的一个区别,是它元素必须都是同一种数据类型,比如都是数字int类型,这也是Numpy高性能的一个原因
array本身的属性:
shape:返回一个元组,表示array的维度
ndim:一个数字,表示array的维度的数目
size:一个数字,表示array中所有数据元素的数目
dtype:array中元素的数据类型
创建array的方法:
从Python的列表List和嵌套列表创建array
使用预定函数arange、ones/ones_like、zeros/zeros_like、empty/empty_like、full/full_like、eye等函数创建
生成随机数的np.random模块构建
array本身支持的大量操作和函数:
直接逐元素的加减乘除等算数操作
更好用的面向多维的数组索引
求sum/mean等聚合函数
线性代数函数,比如求解逆矩阵、求解方程组
1.使用Python的List和嵌套List创建一维的array和二维的array¶
In [1]:
import numpy as np
In [4]:
# 创建一个一维数组,也就是Python的单元素List
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
In [6]:
x
Out[6]:
array([1, 2, 3, 4, 5, 6, 7, 8])
In [5]:
# 创建一个二维数组,也就是Python的嵌套List
X = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8]
])
In [7]:
X
Out[7]:
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
2.探索数组array的属性
In [7]:
x.shape
Out[7]:
(8,)
In [8]:
X.shape
Out[8]:
(2, 4)
In [9]:
x.ndim # 维度
Out[9]:
1
In [10]:
X.ndim
Out[10]:
2
In [11]:
x.size # 元素个数
Out[11]:
8
In [12]:
X.size
Out[12]:
8
In [13]:
x.dtype # 数组类型
Out[13]:
dtype('int32')
In [14]:
X.dtype
Out[14]:
dtype('int32')
3.创建array的便捷函数
使用arange创建数组序列
arange([star,] stop[,step], dtype=None)
In [15]:
np.arange(10)
Out[15]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [16]:
np.arange(2, 10, 2) # 开始数字、结束数字、步长
Out[16]:
array([2, 4, 6, 8])
使用ones创建全是1的数组
np.ones(shape, dtype=None, order=‘C’) shape:int or tuple of ints Shape of the new array
In [2]:
np.ones(10)
Out[2]:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
In [3]:
np.ones((2, 3)) # 2行3列,里面全是1
Out[3]:
array([[1., 1., 1.],
[1., 1., 1.]])
使用ones_like创形状相同的数组
ones_like(a, dtype=float, order=‘C’)
In [8]:
np.ones_like(x)
Out[8]:
array([1, 1, 1, 1, 1, 1, 1, 1])
In [9]:
np.ones_like(X)
Out[9]:
array([[1, 1, 1, 1],
[1, 1, 1, 1]])
使用zeros创建全是0的数组
np.zeros(shape, dtype=None, order=‘C’)
In [10]:
np.zeros(10)
Out[10]:
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [11]:
np.zeros((2, 4))
Out[11]:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.]])
使用zeros_like创建形状相同的数组
np.zeros_like(a, dtype=None)
In [12]:
np.zeros_like(x)
Out[12]:
array([0, 0, 0, 0, 0, 0, 0, 0])
In [13]:
np.zeros_like(X)
Out[13]:
array([[0, 0, 0, 0],
[0, 0, 0, 0]])
使用empty创建全是0的数组
empty(shape, dtype=float, order=‘C’) 注意:数据是未初始化的,里面的值可能是随机值不要用
In [14]:
np.empty(10)
Out[14]:
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [15]:
np.empty((2, 4))
Out[15]:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.]])
使用empty_like创建形状相同的数组
empty_like(prototype, dtype=None)
In [16]:
np.empty_like(x)
Out[16]:
array([ 0, 1, 0, 309460992, 1208, 0,
768, 0])
In [17]:
np.empty_like(X)
Out[17]:
array([[ 0, 1, 0, 1988385690],
[ 1336, 0, 768, 707]])
使用full创建指定值的数组
np.full(shape, fill_value, dtype=None, order=‘C’) fill_value:指定数值
In [18]:
np.full(10, 666)
Out[18]:
array([666, 666, 666, 666, 666, 666, 666, 666, 666, 666])
In [19]:
np.full((2, 4), 333)
Out[19]:
array([[333, 333, 333, 333],
[333, 333, 333, 333]])
使用full_like创建形状相同的数组
np.full_like(a, fill_value, dtype=None)
In [20]:
np.full_like(x, 666)
Out[20]:
array([666, 666, 666, 666, 666, 666, 666, 666])
In [21]:
np.full_like(X, 333)
Out[21]:
array([[333, 333, 333, 333],
[333, 333, 333, 333]])
使用random模块生成随机数的数组
randn(d0, d1, …, dn)
In [23]:
np.random.randn()
Out[23]:
1.3041274823851632
In [24]:
np.random.randn(3)
Out[24]:
array([-1.69559411, -0.28996081, -1.10831168])
In [25]:
np.random.randn(3, 2)
Out[25]:
array([[-0.55100232, -0.15160487],
[ 1.09386724, -0.50999178],
[ 0.41499733, 0.67933198]])
In [27]:
np.random.randn(3, 2, 4) # 3块,2行4列
Out[27]:
array([[[-1.16017962, 1.17335421, -2.03851722, 0.33950939],
[ 1.21621513, 0.40530914, 1.29053155, 1.066148 ]],
[[ 2.04862603, 1.3433794 , 0.64982287, 2.01987309],
[ 0.77094165, -1.38293916, 0.62931037, -0.27179504]],
[[-1.09746065, -0.4765639 , 1.36222581, -0.79928358],
[ 0.38376556, 0.26577652, -0.7644308 , 0.78739805]]])
4.array本身支持的大量操作和函数
这些操作如果用Python实现需要写很多for循环,用numpy数组很容易
In [28]:
A = np.arange(10).reshape(2, 5)
A
Out[28]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
In [29]:
A.shape
Out[29]:
(2, 5)
In [30]:
A + 1
Out[30]:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
In [31]:
A * 3
Out[31]:
array([[ 0, 3, 6, 9, 12],
[15, 18, 21, 24, 27]])
In [32]:
np.sin(A)
Out[32]:
array([[ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ],
[-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849]])
In [33]:
np.exp(A)
Out[33]:
array([[1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
5.45981500e+01],
[1.48413159e+02, 4.03428793e+02, 1.09663316e+03, 2.98095799e+03,
8.10308393e+03]])
In [34]:
B = np.random.randn(2, 5)
B
Out[34]:
array([[ 0.14087986, -0.07174085, -1.14846743, 1.27173537, 1.04192297],
[ 0.65623103, 0.07865785, 1.4392768 , -0.59106566, 1.71705766]])
In [35]:
A + B
Out[35]:
array([[ 0.14087986, 0.92825915, 0.85153257, 4.27173537, 5.04192297],
[ 5.65623103, 6.07865785, 8.4392768 , 7.40893434, 10.71705766]])
In [36]:
A - B
Out[36]:
array([[-0.14087986, 1.07174085, 3.14846743, 1.72826463, 2.95807703],
[ 4.34376897, 5.92134215, 5.5607232 , 8.59106566, 7.28294234]])