前言
作为数据分析三巨头Pandas、matplotlib、NumPy之一,必然要给足面子单独拿出来讲解一波。NumPy应用场景十分宽泛,Pandas很多函数转换后也都是NumPy数组类型的数据结构。在机器学习、深度学习以及一些数据处理操作中使用的频率甚至比Pandas都高。而且NumPy功能强大,使用起来也十分便捷,支持多种复杂操作。平时我的Pandas以及一些机器学习的文章都有用到NumPy,但是博客内容并没有详细解答NumPy的操作也没有记录有关NumPy操作的一些具体函数解答。对于我这种追求一站式服务需求的博主来说着实有点不妥,故把旧坑补上,出一期全新的一文速学系列-Numpy数据分析基础专栏。
此系列文章将被纳入我的专栏一文速学系列-NumPy数据分析基础,基本覆盖到使用NumPy数据分析日常业务以及常规的数学建模分析以及复杂操作方方面面的问题。从基础的数组操作逐步入门到处理矩阵矢量特征等复杂操作,以及专业的NumPy常用函数讲解,我都将花费了大量时间和心思创作,如果大家有需要从事数据分析或者数据开发、数学建模、Python工程的朋友推荐订阅专栏,将在第一时间学习到最实用常用的知识。此篇博客篇幅较长,值得细读实践一番,我会将精华部分挑出细讲实践。博主会长期维护博文,有错误或者疑惑可以在评论区指出,感谢大家的支持。
本期内容主要详解ndarray各类属性对应输出函数,以及创建方式和输出打印方式。
一、axes数组轴
NumPy的主要对象是同构多维数组。它是一个元素表(通常是数字),所有元素都是相同类型的,由非负整数元组索引。在NumPy中,尺寸称为轴(axes)。
例如,三维空间中一个点的坐标数组[1,2,3]有一个轴。该轴中有3个元素,因此我们说它的长度为3。这里我们可以以xy轴来理解这个矩阵:
[[1, 2, 3], [0, 1, 2]]
第一轴为y轴,大小为2,第二轴为x轴,大小为3
.
二、ndarray属性
NumPy的数组类称为ndarray。注意numpy数组ndarray与标准Python库的array不同,array它只处理一维数组,功能较少。ndarray对象更重要的属性是:
ndarray.ndim
数组的轴数(维度)。
ndarray.shape
数组的维数。这是一个整数元组,表示每个维度中数组的大小。对于具有n行和m列的矩阵,数组结构将为(n,m)。
ndarray.size
数组的元素总数。等于数组结构元素个数。
ndarray.dtype
描述数组中元素类型的对象。可以使用标准Python类型创建或指定dtype。此外,NumPy还提供了自己的类型。numpy.int32,numpy.int16和numpy.float64。
ndarray.itemsize
数组每个元素的字节大小。例如,float64类型的元素数组具有itemsize 8 (=64/8),而complex32类型的元素之一具有itemsize 4 (=32/8)。它等效于ndarray.dtype.itemsize。
ndarray.data
包含数组实际元素的缓冲区。一般我们不需要使用此属性,自动索引工具访问数组中的元素。
代码展示:
import numpy as np a=np.array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [8, 9, 10, 11]]) a
ndarray.ndim
数组维度:
a.ndim
ndarray.shape
数组维数:
a.shape
ndarray.size
数组的元素总数:
a.size
ndarray.dtype
数组中元素类型的对象:
a.dtype
ndarray.itemsize
a.itemsize
一个int为4个字节
ndarray.data
数组实际元素的缓冲区:
a.data
三、ndarray创建
可以使用array函数从常规Python列表或元组创建数组。结果数组的类型是根据序列中元素的类型推导出来的。
1.array()
例如我们刚刚举例的:
a=np.array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [8, 9, 10, 11]])
推导出他的数据类型为int32,那么我们换个数组:
b=np.array([ 0.1, 1.1, 2.1, 3.1]) b.dtype
根据元素类型推导为float64。
array函数可以将序列转换为二维数组,将序列转化为三维数组:
b=np.array([(1,2,3),(4,5,6)]) b
数组的类型也可以在创建时明确指定:
b=np.array([(1,2,3),(4,5,6)], dtype=float) b
2.zeros()/ones()/empty()
函数zeros创建一个充满零的数组,函数ones创建一个装满一的数组,而函数empty创建一个数组,其初始内容是随机的,取决于内存的状态。默认情况下,创建的数组的dtype为float64,但可以通过关键字参数dtype指定。
np.zeros((2, 3))
np.ones((2, 3, 4), dtype=np.int16)
第一个1参数为矩阵个数,然后是维度。
np.empty((2, 3))
3.arange()/linspace()
为了创建数字序列,NumPy提供了arange函数,该函数类似于Python内置范围,但返回一个数组。
np.arange(0, 10, 2)
当arange与浮点参数一起使用时,由于浮点精度有限,通常无法预测获得的元素数。因此,通常最好使用函数linspace,该函数接收我们想要的元素数量作为参数:
np.linspace(0, 2, 6)
0为初始值,2为终止值,6为切分个数:
四、ndarray输出
打印数组时,NumPy以与嵌套列表类似的方式显示,布局如下:
- 最后一个轴从左到右打印
- 倒数第二个从上到下打印
- 其余的也从上到下打印,每个切片与下一个切片之间用空行隔开
一维数组打印为行,二维打印为矩阵,三维打印为矩阵列表。
a=np.arange(4) print(a)
a=np.array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [8, 9, 10, 11]]) print(a)
print(np.ones((2, 3, 4), dtype=np.int16))
如果数组太大而无法打印,NumPy会自动跳过数组的中心部分,只打印角点:
print(np.arange(10000))
要禁用此行为并强制NumPy打印整个数组,可以使用set_printoptions更改打印选项。
np.set_printoptions(threshold=sys.maxsize)