数据的维度
维度:一组数据的组织形式。
一维数据:由对等关系的有序或无序数据构成,采用线性方式组织,对应列表、数组、集合等概念。
其中:
列表和数组:
都是一组数据的有序结构。
二者区别:
列表的数据类型可以不同,数组的数据类型必须相同。
二维数据:由多个一维数据构成,是一维数据的组合形式。表格是典型的二维数据,其中,表头是二维数据的一部分。例如:列表元素是列表。
多维数据:由一维数据或者二维数据在新维度上扩展形成。
高维数据:仅利用最基本的二元关系展示数据间的复杂结构,利用键值对组织数据。例如:字典。
NumPy的数组对象:ndarray
概述
NumPy是SciPy、Pandas等数据处理或科学计算库的基础。
ndarray是一个多维数组对象,由两部分构成:
1、实际存储的数据
2、描述这些数据的元数据(数据维度、数据类型)。
ndarray数组一般要求所有元素类型相同(同质),数组下标从0开始。
轴(axis):保存数据的维度
秩(rank):轴的数量
Numpy的引用
import numpy as np
其中,np
是指引入模块的别名,尽管别名可以省略或更改,建议使用上述约定的别名。如果使用numpy会麻烦,代码变长,倘若使用其它的别名,他人不熟悉,所以numpy
就为np
。
为什么有了列表类型还需要引入N维数组?
(N维数组对象:ndarray)
1.数组对象可以去掉元素间运算所需的循环,使得一维向量更像单个数据。
2.设置专门的数组对象,经过优化,可以提升这类应用的运算速度。(numpy底层是C,可以提供高效的运算)
3.观察:科学计算中,一个维度所有数据的类型往往相同,数组对象采用相同的数据类型,有助于节省运算和存储空间。
def pySum():
a = [0,1,2,3,4]
b = [5,6,7,8,9]
c = a + b
return c
print(pySum())
结果如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
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]+b[i])
return c
print(pySum())
结果如下:
[5, 7, 9, 11, 13]
import numpy as np
def npSum():
a = np.array([0,1,2,3,4])
b = np.array([5,6,7,8,9])
c = a + b
return c
print(npSum())
结果如下:
[ 5 7 9 11 13]
ndarray对象的属性
.ndim
:秩,即轴的数量或者维度的数量
.shape
:ndarray对象的尺度,对于矩阵,n行m列
.size
:ndarray对象元素的个数,相当于.shape中n*m的值
.dtype
:ndarray对象的元素类型
.itemsize
:ndarray对象每个元素的大小,以字节为单位
a = np.array([[1,2,3],[4,5,6]])
#生成的矩阵实际上是这样的:
# 1 2 3
# 4 5 6
a.ndim
2 #有两个维度
a.shape
(2, 3) #两行三列
a.size
6 #共有 2*3 = 6 个元素
a.dtype
dtype('int32') #元素类型是32位整型
a.itemsize
4 #每个元素的大小为4个字节
ndarray的元素类型
ndarray为什么要支持这么多种元素类型呢?
(Python语法仅支持整数、浮点数和复数3种类型)
1.科学计算涉及数据较多,对存储和性能都有较高要求。
2.对元素类型精细定义,有助于NumPy合理使用存储空间并优化性能。
3.对元素类型精细定义,有助于程序员对程序规模有合理评估。
非同质的ndarray对象
ndarray数组可以由非同质对象构成。
非同质ndarray元素为对象类型(dtype = object
)。
非同质ndarray对象无法有效发挥NumPy优势,尽量避免使用。
ndarray数组的创建
(一)从Python中的列表、元组等类型创建ndarray数组
x = np.array(list/tuple)
x = np.array(list/tuple, dtype=np.float32)
#当不指定 dtype 时,NumPy将根据数据情况关联一个dtype类型
x = np.array([0,1,2,3]) #从列表类型创建
print(x)
结果:
[0 1 2 3]
#-----------------------------------------------------
x = np.array((7,8,9,10)) #从元组类型创建
print(x)
结果:
[ 7 8 9 10]
#-----------------------------------------------------
x = np.array([[1,2],[3,4],(5.,6.)]) #从列表和元组混合类型创建
print(x)
结果:
[[1. 2.]
[3. 4.]
[5. 6.]]
(二)使用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
In [27]:np.arange(10)
Out[27]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#------------------------------------------------------------
In [28]:np.ones((3,6))
Out[28]:
array([[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.]])
#------------------------------------------------------------
In [29]:np.zeros((5,5),dtype = np.int32)
Out[29]:
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
#------------------------------------------------------------
In [30]:np.full((3,4),2)
Out[30]:
array([[2, 2, 2, 2],
[2, 2, 2, 2],
[2, 2, 2, 2]])
#------------------------------------------------------------
In [31]:np.eye(5)
Out[31]:
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0