一个数据,表达一个含义
一组数据,表达一个或多个含义
列表:数据类型可以不同
数组:数据类型相同
计算 A 2 + B 3 A^2+B^3 A2+B3,其中A和B是一维数组
Python内置列表类型
def pySum():
a = [0,1,2,3,4]
b = [5,6,7,8,9]
c = []
for i in range(len(a)):
c.append(a[i]**2+b[i]**3)
return c
print(pySum())
numpy数组
import numpy as np
def npSum():
a = np.array([0,1,2,3,4])
b = np.array([5,6,7,8,9])
c = a**2 + b**3
return c
print(npSum())
np.array()
生成一个ndarray数组,输出成[]
形式,元素由空格分隔
轴(axis): 保存数据的维度;秩(rank):轴的数量
In [1]: import numpy as np
In [2]: a = np.array([[0,1,2,3],[4,5,6,7]])
In [3]: a
Out[3]:
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
In [4]: a.ndim
Out[4]: 2
In [5]: a.shape
Out[5]: (2, 4)
In [6]: a.size
Out[6]: 8
In [7]: a.dtype
Out[7]: dtype('int32')
In [8]: a.itemsize
Out[8]: 4
In [9]: b = np.array([[0,1,2,3,4],[5,6,7]])
# ndarray数组可以由非同质对象构成
In [10]: b
Out[10]: array([[0, 1, 2, 3, 4], [5, 6, 7]], dtype=object)
# 非同质ndarray元素为对象类型
In [11]: b.ndim
Out[11]: 1
In [12]: b.shape
Out[12]: (2,)
In [13]: b.size
Out[13]: 2
# 非同质ndarray对象无法有效发挥NumPy优势,尽量避免使用
In [14]: b.dtype
Out[14]: dtype('O')
In [15]: b.itemsize
Out[15]: 8
属性 | 说明 |
---|---|
.ndim |
秩,即轴的数量或维度的数量 |
.shape |
ndarray对象的尺度,对于矩阵,n行m列 |
.size |
ndarray对象元素的个数,相当于.shape中n*m的值 |
.dtype |
ndarray对象的元素类型(bool,intc,intp,int8,int16,int32,int64) |
.itemsize |
ndarray对象中每个元素的大小,以字节为单位 |
从Python中的列表、元组等类型创建ndarray数组
x = np.array(list/tuple, dtype=np.float32)
当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型
使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等
函数 | 说明 |
---|---|
np.arange(n) |
类似range()函数,返回ndarray类型,元素从0到n‐1 |
np.ones(shape) |
根据shape生成一个全1数组,shape是元组类型 |
np.zeros(shape) |
根据shape生成一个全0数组,shape是元组类型 |
np.full(shape,val) |
根据shape生成一个数组,每个元素值都是val |
np.eye(n) |
创建一个正方的n*n单位矩阵,对角线为1,其余为0 |
np.ones_like(a) |
根据数组a的形状生成一个全1数组 |
np.zeros_like(a) |
根据数组a的形状生成一个全0数组 |
np.full_like(a,val) |
根据数组a的形状生成一个数组,每个元素值都是val |
使用NumPy中其他函数创建ndarray数组
函数 | 说明 |
---|---|
np.linspace() |
根据起止数据等间距地填充数据,形成数组 |
np.concatenate() |
将两个或多个数组合并成一个新的数组 |
In [2]: a = np.linspace(1,10,4)
In [3]: a
Out[3]: array([ 1., 4., 7., 10.])
In [4]: b = np.linspace(1,10,4,endpoint=False)
In [5]: b
Out[5]: array([ 1. , 3.25, 5.5 , 7.75])
py
In [6]: c = np.concatenate((a,b))
In [7]: c
Out[7]: array([ 1. , 4. , 7. , 10. , 1. , 3.25, 5.5 , 7.75])
对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换
维度变换
方法 | 说明 |
---|---|
.reshape(shape) |
不改变数组元素,返回一个shape形状的数组,原数组不变 |
.resize(shape) |
与.reshape()功能一致,但修改原数组 |
.swapaxes(ax1,ax2) |
将数组n个维度中两个维度进行调换 |
.flatten() |
对数组进行降维,返回折叠后的一维数组,原数组不变 |
实例:
In [8]: d = np.ones((2,3,4),dtype=np.int32)
In [9]: d.reshape((3,8))
Out[9]:
array([[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]])
In [10]: d
Out[10]:
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]])
In [11]: d.resize((3,8))
In [12]: d
Out[12]:
array([[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]])
In [13]: d.flatten()
Out[13]:
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1])
In [14]: d
Out[14]:
array([[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]])
类型变换
new_a = a.astype(new_type)
astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致
In [2]: e = np.ones((2,3,4),dtype=np.int)
In [3]: e
Out[3]:
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]])
In [4]: e.astype(np.float)
Out[4]:
array([[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]],
[[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]]])
数组向列表的转换
ls = a.tolist()
In [2]: a = np.full((2,3,4),25,dtype=np.int32)
In [3]: a
Out[3]:
array([[[25, 25, 25, 25],
[25, 25, 25, 25],
[25, 25, 25, 25]],
[[25, 25, 25, 25],
[25, 25, 25, 25],
[25, 25, 25, 25]]])
In [4]: a.tolist()
Out[4]:
[[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]],
[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]
索引:获取数组中特定元素位置的过程
切片:获取数组元素子集的过程
一维数组的索引和切片:与Python的列表类似
每个维度切片方法与一维数组相同
每个维度可以使用步长跳跃切片
In [2]: a = np.array([9,8,7,6,5])
In [3]: a[2]
Out[3]: 7
In [4]: a[1:4:2]
Out[4]: array([8, 6])
多维数组的切片
In [5]: b = np.arange(24).reshape((2,3,4))
In [6]: b
Out[6]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
In [7]: b[1,2,3]
Out[7]: 23
In [8]: b[-1,-2,-3]
Out[8]: 17
数组与标量之间的运算作用于数组的每一个元素
NumPy一元函数
对ndarray中的数据执行元素级运算的函数
函数 | 说明 |
---|---|
np.abs(x) 、np.fabs(x) |
计算数组各元素的绝对值 |
np.sqrt(x) |
计算数组各元素的平方根 |
np.square(x) |
计算数组各元素的平方 |
np.log(x) 、 np.log10(x) 、np.log2(x) |
计算数组各元素的自然对数、10底对数和2底对数 |
np.ceil(x) 、np.floor(x) |
计算数组各元素的ceiling值 或 floor值 |
np.rint(x) |
计算数组各元素的四舍五入值 |
np.modf(x) |
将数组各元素的小数和整数部分以两个独立数组形式返回 |
np.cos(x) 、np.cosh(x) 、np.sin(x) 、np.sinh(x) 、np.tan(x) 、np.tanh(x) |
计算数组各元素的普通型和双曲型三角函数 |
np.exp(x) |
计算数组各元素的指数值 |
np.sign(x) |
计算数组各元素的符号值,1(+), 0, ‐1(‐) |
NumPy二元函数
函数 | 说明 |
---|---|
+ 、‐ 、* 、/ 、** |
两个数组各元素进行对应运算 |
np.maximum(x,y) 、np.fmax() np.minimum(x,y) 、np.fmin() |
元素级的最大值/最小值计算 |
np.mod(x,y) |
元素级的模运算 |
np.copysign(x,y) |
将数组y中各元素值的符号赋值给数组x对应元素 |
> 、< 、>= 、<= 、== 、!= |
算术比较,产生布尔型数组 |