Numpy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。numpy的快速、方便使得其运用广泛。
目录
1、Ndarray对象的生成
使用np.array()生成ndarray对象
使用np.arange()生成ndarray对象
生成浮点型ndarray对象
生成bool型的ndarray对象
2、Ndarray对象类型的转换
不同ndarry对象类型的转换
Ndarray对象类型的小数变换
3、Ndarray多维对象的生成
多维数组的生成
不同维度数组的转换
import numpy as np
import random
# 使用array生成数组,得到ndarray的类型
a = np.array([1, 2, 3])
print(a)
print(type(a))
运行结果如下:
可以看出np.array生成了一个一行三列的数组对象,数据的类型为ndarray,ndarray 对象是用于存放同类型元素的多维数组。
arange里面的参数包括起点,终点,步长。看例子:
# 使用arange生成数组,得到ndarray的类型
b = np.arange(0, 12, 2)
print(b)
print(type(b))
运行结果如下图:
可以看出,同样生成了ndarray对象,同时可以发现,arange()与range()用法相似,都是含头不含尾。但是需要注意array里面的参数数据对象需要用[ ]装起来,不然会有问题。具体问题是什么大家可以试一下,不会报错,但数据有问题。
生成是浮点数的ndarray对象,主要在参数中添加dtype=‘float32’即可!代码如下:
# 生成浮点型的ndarray
c = np.array(range(1, 6, 1), dtype='float32')
print(c)
print(type(c))
运行结果如下图:
生成了浮点数1,2,3,4,5 。既然有浮点数,那么是不是也有bool型呢?
生成bool类型和浮点型一样,只需要修改dtype类型为bool即可。见代码:
# 生成bool型的ndarray
d = np.array([1, 0, 1, 0, 1, 1, 1], dtype='bool')
print(d)
print(type(d))
运行结果如下:
很明显可以看出,生成了True和False的bool类型的ndarray对象,也就是bool数组。
在使用时,往往可能需要对数组的类型进行转换,比如将bool型显示成1和0;把整型转化成浮点型,需要使用astype()函数,括号里面为转换的类型。代码如下:
# 将bool型转化为整型
e = d.astype('int8')
print(e)
print(e.dtype)
print(type(e))
# 将整型转化为浮点型
f = e.astype('float32')
print(f)
print(f.dtype)
print(type(f))
运行结果如下:
我们将bool类型的数组,通过astype()转化成了整型和浮点型的ndarray对象。通过dtype看得出来生成了int8型和float32型,即整型和浮点型。
往往在生成adarray数组对对象时会生成有很多为小数点的小数,那么如何对小数点部分进行保留呢?可以通过np.round()函数对小数进行位数保留。代码如下:
# 生成0-1的一维数组
g = np.array([random.random() for i in range(10)])
print(g)
print(g.dtype)
# 对g保留两位小数
h = np.round(g, 2)
print(h)
print(h.dtype)
运行结果如下:
通过random.random()可以生成一个(0,1)的实数,可以看到生成的数据小数点后有八位。如果我们只需要两位,可以通过np.round()函数,设置参数为2,保留两位小数。保留位数后,数组的类型没有发生变化。
1、2部分的完整代码如下:
import numpy as np
import random
# 使用array生成数组,得到ndarray的类型
a = np.array([1, 2, 3])
print(a)
print(type(a))
# 使用arange生成数组,得到ndarray的类型
b = np.arange(0, 12, 2)
print(b)
print(type(b))
# 生成浮点型的ndarray
c = np.array(range(1, 6, 1), dtype='float32')
print(c)
print(type(c))
# 生成bool型的ndarray
d = np.array([1, 0, 1, 0, 1, 1, 1], dtype='bool')
print(d)
print(type(d))
# 将bool型转化为整型
e = d.astype('int8')
print(e)
print(e.dtype)
print(type(e))
# 将整型转化为浮点型
f = e.astype('float32')
print(f)
print(f.dtype)
print(type(f))
# 对小数点位数进行保留操作
g = np.array([random.random() for i in range(10)])
print(g)
print(g.dtype)
# 对g保留两位小数
h = np.round(g, 2)
print(h)
print(h.dtype)
如何生成二维的数组呢?大胆猜想一下,是不是需要在array()里面传递两个参数呢?看代码:
import numpy as np
import random
# 二维数组
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.shape)
# 三维数组
b = np.array([[[1, 2, 3], [4, 5, 6]]])
print(b)
print(b.shape)
运行结果如下:
同样是1,2,3,4,5,6生成的数组怎么一个是2x3一个是1x2x3呢?细心的人会发现b的array中的[ ]比a中多一对,相信聪明的人已经猜出来了。没错,多少对[ ]就会生成几维数组。
不同维度的数组是不是能相互转换呢?答案是肯定的,通过reshape()对数组的维度进行转换。比如把刚才的三维数组转化为一维数组,见代码:
# 三维数组转化为一维数组
c = b.reshape(6)
print(c)
print(c.shape)
运行结果如下:
可以看到数组变成了一维。可能有的小伙伴在想,为什么只在reshape()里面写个6,一维的六个数,不应该是reshape(1,6)吗?问得好,代码试一下:
d = b.reshape(1, 6)
print(d)
print(d.shape)
运行结果如下:
很明显,生成了一个二维数组。这是为什么呢?在reshape中,括号里面有几个数,就会生成几维数组。
在numpy中有一个维度拉伸函数,flatten()可以将高维度的数组直接拉伸为一维数组,比如将刚才的三维数组通过flatten()拉伸到一维。代码如下:
# 通过flatten将高维数组拉伸到一维数组
e = b.flatten()
print(e)
print(e.shape)
运行结果如下:
显而易见,三维数组直接被拉伸到一维,是不是很方便!!!
整体代码如下:
import numpy as np
import random
# 二维数组
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.shape)
# 三维数组
b = np.array([[[1, 2, 3], [4, 5, 6]]])
print(b)
print(b.shape)
# 三维数组转化为一维数组
c = b.reshape(6)
print(c)
print(c.shape)
d = b.reshape(1, 6)
print(d)
print(d.shape)
# 通过flatten将高维数组拉伸到一维数组
e = b.flatten()
print(e)
print(e.shape)
总结:这篇文章主要写了一些numpy的基本操作,包括数组的生成(一维、多维),同时讲解了不同维度数组的 转化,以及不同类型数组的转化,让大家对数组有个整体直观的认识。后续会对numpy有更深,更为实用的讲解。