3.2 创建与存取数组
来源:互联网 发布:java ftp断点续传 编辑:程序博客网 时间:2024/06/05 02:08
本节主要介绍NumPy库ndarray对象的创建与保存方法,以及对其属性的操作方法。
3.2.1 创建ndarray数组
使用NumPy库里的array()函数创建数组,它接受一切序列的对象,包括其他数组,如果传递的是多层嵌套序列,将创建多维数组。示例代码:
>>>a = np.array([1, 2, 3, 4])>>>b = np.array((5, 6, 7, 8))>>>c = np.array([[ 1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]])
数组Python标准库提供的type()函数可以判断对象的类型。示例代码:
>>>type(a)numpy.ndarray
返回结果是numpy.ndarray,即创建了NumPy的ndarray对象。
通过Python自带的help()函数或者NumPy库里的info()函数,可以查询NumPy中函数、方法和属性的详细信息。示例代码:
>>>help(np.array)Help on built-in function array in module numpy.core.multiarray:array(...) array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0) Create an array.……>>>np.info(np.array)array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)Create an array.……
3.2.2 数组的属性
NumPy库中提供了很多便捷的属性和方法,以查询数组的相关信息。
1. shape属性与reshape()方法
数组的大小可以通过其shape属性获得,示例代码:
>>>a.shape(4, )>>>c.shape(3, 4)
数组a的shape只有一个元素,因此它是一维数组。而数组c的shape有两个元素,因此它是二维数组。(3, 4)表示数组c的第0轴的长度为3(行),第1轴的长度为4(列)。
使用reshape()函数可以重新定义原数组行和列的值,返回新的数组对象。注意参数中行列个数的乘积要与原数组元素的个数保持一致,此外reshape()函数对原数组没有影响,即不改变原数组的元素位置。示例代码:
>>>arr = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]])>>>arr.reshape(1, 25)array([[11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]])
2. dtype属性与astype()方法
dtype属性返回数组中每个元素的数据类型。如果参数序列元素全是整数,那么所创建数组元素的类型也是整数。示例代码:
>>>arr1 = np.array([1, 2, 3, 4])>>>arr1.dypedtype('int32')
int32表示元素的数据类型是整型,元素的位长是32位。NumPy中,同一数组中的元素类型必须统一,经常使用的数据类型如下表所示:
在创建数组时,可以加入dtype参数限定数据类型的对象。示例代码:
>>>arr2 = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]], dtype = float32)>>>arr2array([[1., 2., 3., 4.], [4., 5., 6., 7.], [7., 8., 9., 10.]])
通过astype()函数可以对数组中每个元素的数据类型进行转化。示例代码:
>>>data3 = [1, 2, 3, 4, 5]>>>arr3 = np.array(data)>>>arr3.dtypedtype('int32')>>>float_arr = arr1.astype(np.float32)>>>float_arr.dtypedtype('float32')
与reshape()输出结果不同,astype()函数改变了原数组元素的属性,而reshape()方法对原数组保持不变。
3. size属性和ndim属性
size属性返回数组元素的个数;ndim属性返回数组的维度。示例代码:
>>>arr4 = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]])>>>arr4.size25>>>arr4.ndim2
3.3.3 其他方式创建数组
上面的例子都是先创建一个序列,然后通过array函数将其转换为数组,这样做显然效率不高,因此NumPy提供了许多专门用来创建数组的函数。
arange()函数类似于Python的range函数,通过指定开始值、终值和步长来创建一维数组,注意数组不包括终值。示例代码:
>>>np.arange(0, 1, 0.1)array([ 0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
linspace()函数通过指定开始值、终值和元素个数来创建一维数组,可以通过endpoint关键字指定是否包括终值,缺省设置是包括终值,示例代码:
>>>np.linspace(0, 1, 12)array([ 0. , 0.09090909, 0.18181818, 0.27272727, 0.36363636, 0.45454545, 0.54545455, 0.63636364, 0.72727273, 0.81818182, 0.90909091, 1. ])
logspace()函数和linspace()函数类似,不过它创建等比数列,指定开始值和终值是10的幂值,下面的例子产生1(10^0)到100(10^2)、有20个元素的等比数列,示例代码:
>>>np.logspace(0, 2, 20)array([ 1. , 1.27427499, 1.62377674, 2.06913808, 2.6366509 , 3.35981829, 4.2813324 , 5.45559478, 6.95192796, 8.8586679 , 11.28837892, 14.38449888, 18.32980711, 23.35721469, 29.76351442, 37.92690191, 48.32930239, 61.58482111, 78.47599704, 100. ])
zeros()和ones()函数是根据给定的形状参数(shape),分别返回一个元素全部为0的数组或者全部为1的数组。示例代码:
>>>np.zeros((2, 3))array([[ 0., 0., 0.], [ 0., 0., 0.]])>>>np.ones((3, 2))array([[ 1., 1.], [ 1., 1.], [ 1., 1.]])
eye()函数返回一个对角线元素为1,其他元素为0的二维数组。示例代码:
>>>np.eye(3)array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]])
full()函数,可以根据给定的行列参数及指定值,创建元素统一为指定值的数组。示例代码:
>>>np.full((2, 3), 7)array([[ 7., 7., 7.], [ 7., 7., 7.]])
NumPy库中random模块提供大量的随机数相关函数,返回不同分布或序列的随机数元素数组,各函数名及功能如下表所示:
示例代码:
>>>np.random.rand(4, 3)array([[ 0.06656639, 0.98441457, 0.41562723], [ 0.55361735, 0.28230227, 0.9850847 ], [ 0.87730206, 0.15071579, 0.34109152], [ 0.18123692, 0.82597656, 0.10593983]])>>>np.random.randn(4, 3)array([[ 1.65730492, 0.42038461, -0.88787035], [ 0.77341888, -0.402507 , -0.39044014], [-0.18054801, 1.18733182, -0.87334895], [-0.12622612, -2.13722455, -0.29762197]])>>>np.random.randint(0, 10, (4, 3))array([[4, 7, 1], [3, 0, 4], [6, 2, 5], [9, 9, 2]])
3.2.4 数组存取
numpy.load和numpy.save函数以NumPy专用的二进制类型保存数据,这两个函数会自动处理元素类型和shape等信息,使用它们读写数组非常方便,但是numpy.save输出的文件很难和其它语言编写的程序读入,示例代码:
>>>arr = np.arange(12).reshape((4, 3)) #产生从0到11的序列,并以4行3列的方式返回给arr>>>arrarray([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11]])>>>np.save("arr.npy", arr) #以arr.npy的文件名保存数组arr>>>s = np.load("arr.npy") #读取arr.npy文件并返回给s>>>sarray([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11]])
此外numpy.savez函数可以将多个数组保存到一个文件,savez(函数的一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起一个名字,以非关键字参数传递的数组会自动起名为arr_0、arr_1、…。savez()函数输出一个压缩文件(扩展名为npz),其中每个文件都是一个save函数保存的npy文件,文件名对应于数组名。load函数自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容,示例代码:
>>>a = np.array([[1, 2, 3],[4, 5, 6]])>>>b = np.arange(0, 1.0, 0.1)>>>c = np.random.randn(4, 4)>>>np.savez("save.npz", a, b, k_c=c)>>>s = np.load("save.npz")>>>s["arr_0"] #数组aarray([[1, 2, 3], [4, 5, 6]])>>>s["arr_1"] #数组barray([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])>>>s["k_c"] #数组carray([[-0.02499583, -0.42932972, -0.87850541, 1.22665883], [ 0.84368525, 1.13089567, -1.06471769, -1.24888949], [-0.04705682, -0.27626076, -0.71521138, 1.17094273], [-0.45764641, 0.16822594, 0.41377784, 0.57015392]])
如下图所示,ipython文件列表存在与程序文件(Untitled.ipynb)同一目录级别的arr.npy和save.npz文件,其中arr.npy保存着数组arr的内容。如果用解压软件打开save.npz文件,会发现其中有三个文件:arr_0.npy,arr_1.npy,k_c.npy,分别保存着数组a,b,c的内容。
ndarray数组除了保存为NumPy自带的格式,也可以保存为txt格式,与此同时,NumPy也可以加载csv或者txt文件以转换成ndarray形式数据。示例代码:
>>>arr = np.genfromtxt("myfile.csv", delimiter = ',', dtype = "string") #从myfile.csv中导入数据,以逗号为间隔符,类型为string型>>>np.savetxt("myarray.txt", arr, delimiter = ' ') #将arr保存到myarray.txt文件,以空格为间隔符
- 3.2 创建与存取数组
- 创建顺序存取文件
- 数组存取基本数据类型
- Numpy--存取数组
- java数组创建与遍历
- jquery数组遍历 与 创建数组
- 【使用Property创建存取器】
- 复合与存取方法
- package与存取权限
- python用list存取数组
- c++动态二维数组创建与释放!
- 对象数组的创建与删除
- 结构struct动态数组创建与操作
- java 数组的创建与注意事项
- Java 数组的声明与创建
- 动态三维数组的创建与释放
- 创建星宿与生日对照的数组
- 一维与二维动态数组创建
- caffe (8)caffe可视化—安装jupiter测试模型
- 前端JS知识要点总结(3)
- TensorFlow环境搭建
- 微信小程序开发常用技巧(5)——view左右滑动,切换page页面
- 使用Python对操作文件及目录
- 3.2 创建与存取数组
- git代码管理
- opencv在图像上作画
- 欢迎使用CSDN-markdown编辑器
- 回溯算法
- TensorFlow教程 4 Tensorboard 可视化好帮手
- maven手动安装jar包
- LeetCode(15)--3Sum
- 手机通讯录