array对象的背景:
- Numpy的核心数据结构,就叫做array就是数组,array对象可以是一维数组,也可以是多维数组;
- Python的List也可以实现相同的功能,但是array比List的优点在于性能好、包含数组元数据信息、大量的便捷函数;
- Numpy成为事实上的Scipy、Pandas、Scikit-Learn、Tensorflow、PaddlePaddle等框架的“通用底层语言”
- Numpy的array和Python的List的一个区别,是它元素必须都是同一种数据类型,比如都是数字int类型,这也是Numpy高性能的一个原因;
array本身的属性:
- shape:返回一个元祖,表示array的维度
对于一维数组返回:(n,) 表示这个数组有多少个元素
对于多维数组返回:(n,m)表示这个数组是n维数组,每个数组中m个元素 - 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
# 首先倒入numpy包
import numpy as np
# 创建一个一维数组,也就是Python的单元素List
>>> x = np.array([1,2,3,4,5,6,7,8])
>>> x
array([1, 2, 3, 4, 5, 6, 7, 8])
# 创建一个二维数组,也就是Python的嵌套List
>>> Y = np.array([[1,2,3,4],[5,6,7,8]])
>>> Y
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
2.探索数组array的属性
X.shape
>>> X.shape
(8,)
>>> Y.shape
(2, 4)
#数组维度
X.ndim
>>> X.ndim
1
>>> Y.ndim
2
# 数组元素个数
X.size
>>> X.size
8
>>> Y.size
8
#数组中元素类型
X.dtype
>>> X.dtype
dtype('int64')
3.创建array的便捷函数
arange(n) #创建n个元素的数组
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arange(n,m,z) # 创建一个开始为n,截至m(不包含),步长为z的数组
>>> np.arange(2,10,2)
array([2, 4, 6, 8])
4.使用ones创建全是1的数组
np.ones(shape, dtype=None, order='C')
shape : int or tuple of ints Shape of the new array, e.g., (2, 3) or 2.
- shape:表示创建数组的维度
例: np.ones(2) 代表创建一个元素全是1的一维数组
np.ones((2,3))代表创建一个元素全是1的两行三列的二维数组
- dtype:表示创建数组的类型
- order:自行百度
>>> np.ones(2)
array([1., 1.])
>>> np.ones(2,dtype='int32')
array([1, 1], dtype=int32)
>>> np.ones((2,3))
array([[1., 1., 1.],
[1., 1., 1.]])
>>> np.ones((2,3),dtype='int32')
array([[1, 1, 1],
[1, 1, 1]], dtype=int32)
5.使用ones_like创建形状相同的数组
ones_like(a, dtype=float, order='C')
- a表示其他array,可以创建一个维度、元素个数与其他数组但元素为1的数组
>>> a=np.array([1,2,3,4,5,6])
>>> a
array([1, 2, 3, 4, 5, 6])
>>> np.ones_like(a)
array([1, 1, 1, 1, 1, 1])
6.使用zeros创建全是0的数组 np.zeros(shape, dtype=None, order='C')
与ones类似
>>> np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>> np.zeros((2,3))
array([[0., 0., 0.],
[0., 0., 0.]])
7.使用zeros_like创建形状相同的数组 np.zeros_like(a, dtype=None)
与ones_like类似,无例子
8.使用empty创建全是0的数组 empty(shape, dtype=float, order='C') 注意:数据是未初始化的,里面的值可能是随机值不要用
>>> np.empty(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>> np.empty((2,4))
array([[4.9e-324, 9.9e-324, 1.5e-323, 2.0e-323],
[2.5e-323, 3.0e-323, 3.5e-323, 4.0e-323]])
9.使用empty_like创建形状相同的数组 empty_like(prototype, dtype=None)
10.使用full创建指定值的数组
np.full(shape, fill_value, dtype=None, order='C')
>>> np.full(10, 666)
array([666, 666, 666, 666, 666, 666, 666, 666, 666, 666])
>>> np.full((2,4), 333)
array([[333, 333, 333, 333],
[333, 333, 333, 333]])
11.使用full_like创建形状相同的数组 np.full_like(a, fill_value, dtype=None)
12.使用random模块生成随机数的数组 randn(d0, d1, ..., dn)
>>> np.random.randn()
-1.5239105618778928
>>> np.random.randn(3)
array([ 1.91306971, -0.83631081, 0.13392882])
>>> np.random.randn(3, 2)
array([[ 0.95252595, 1.22454571],
[-1.31526104, 1.54766744],
[ 0.58215357, -0.97539854]])
>>> np.random.randn(3, 2, 4)
array([[[ 0.78597989, -0.50458791, -0.85460351, -0.8550491 ],
[ 0.57271511, 1.35345563, -0.25623727, 0.22418455]],
[[ 0.95776224, -0.12411581, -1.21367862, -0.1924964 ],
[ 0.58215031, -0.0259342 , -0.98172368, -0.02095739]],
[[-1.97788288, 1.07953885, 0.32801271, 0.09319918],
[ 0.86101596, 1.83549607, -2.30650547, -1.24515556]]])
13.array本身支持的大量操作和函数 这些操作如果用Python实现需要写很多for循环,用numpy数组很容易
#数组维度转换
#一维数组转为二维数组
>>> A = np.arange(10).reshape(2,5)
>>> A
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
# 所有元素加一
>>> A+1
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
>>>np.sin(A)
>>>np.exp(A)
>>> B = np.random.randn(2,5)
>>> B
array([[-0.78117555, -1.02847184, 0.12548512, 1.36250615, 0.69616677],
[-0.480137 , 0.76012895, 0.49491506, 0.20657476, 0.66638048]])