博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Numpy 数组和dtype的一个使用误区
阅读量:5824 次
发布时间:2019-06-18

本文共 3241 字,大约阅读时间需要 10 分钟。

首先自定义三种类型(如下代码1-3行),第一行使用scalar type,第2,3行使用Structured type。

提出问题:第5,7行同为创建数组,为什么第5行能work,而第7行会raise一个exception:expected an object with a buffer interface呢?

问题解答:原因在于创建numpy数组时,如果指定dtype是Structured type时,List(本例中[1,2])中的元素必须是元组类型的。但是第7行是一般的int型。所以出错。如果指定dtype是scalar type则没有此限制。

后续问题:根据以上分析结果,自然就有了第12行代码。但是错误依然:expected an object with a buffer interface。 但是如果自定义类型有两个或以上的字段(代码3,10),则毫无问题。为什么呢?

问题解答:问题出在元组这边,但定义的元组中只含有一个元素时,该元组就会退化为一般的数据类型而不会被作为元组对待。

解决办法就是如代码14行这样定义List.

另外一种解决方案就是:使用数组的view方法:a=np.array([1,2]).view(dt2)。 效果和代码14行是一样的。

 

1 dt1=np.dtype(np.int32) 2 dt2=np.dtype([('f1', np.int32)]) 3 dt3=np.dtype([('f1', np.int32), ('f2', np.int32)]) 4  5 a=np.array([1,2],dtype=dt1) 6 print a 7 a=np.array([1,2],dtype=dt2) 8 #error: expected an object with a buffer interface 9 10 a=np.array([(1,2),(3,4)],dtype=dt3)11 print a12 a=np.array([(1),(2)],dtype=dt2)13 #error: expected an object with a buffer interface14 a=np.array([(1,),(2,)],dtype=dt2)

 

 其他dtype的使用范例:

1 import numpy as np 2 import sys 3  4 def dTypeTest(): 5     #Using dictionaries. Two fields named ‘gender’ and ‘age’: 6     student=np.dtype({
'names':['name', 'age', 'weight'],'formats':['S32', 'i','f']}, align=True) 7 a=np.array([('zhang',65,123.5),('wang',23,122.5)],dtype=student) 8 print a 9 #Using array-scalar type:10 a=np.array([1,2],dtype=np.dtype(np.int16))11 print a12 13 #Structured type, one field name 'f1', containing int16:14 #a=np.array([1,2],dtype=np.dtype([('f1', np.int16)]))15 a=np.array([1,2]).view(np.dtype([('f1', np.int16)])) 16 print a17 a=np.array([1,2]).view(np.dtype([('f1', np.int32)])) 18 print a19 a=np.array([(1,),(2,)],dtype=np.dtype([('f1', np.int16)]))20 print a21 #below two lines of code is not working as [1,2] is not a list of tuple22 #a=np.array([1,2],dtype=np.dtype([('f1', np.int16)]))23 #a=np.array([(1),(2,)],dtype=np.dtype([('f1', np.int16)]))24 25 #Structured type, one field named ‘f1’, in itself containing a structured type with one field:26 dt=np.dtype([('f1', [('f1', np.int32)])])27 a=np.array([1,2]).view(dt) 28 print a29 a=np.array([((1,),),((2,),)],dtype=dt)30 print a31 #below two lines of code is not working as (1,) is not same as the structure of dtype declared32 #a=np.array([(1,),(2,)],dtype=dt)33 34 #Structured type, two fields: the first field contains an unsigned int, the second an int3235 dt=np.dtype([('f1', np.uint), ('f2', np.int32)])36 a=np.array([(1,2),(3,4)],dtype=dt)37 print a38 39 #Using array-protocol type strings:40 dt=np.dtype([('a','f8'),('b','S10')])41 a=np.array([(3.14,'pi'),(2.17,'e')],dtype=dt)42 print a43 44 #Using comma-separated field formats. The shape is (2,3):45 dt=np.dtype("i4, (2,3)f8")46 a=np.array([(1,[[1,2,3],[4,5,6]]),(2,[[4,5,6],[1,2,3]])],dtype=dt)47 print a48 49 #Using tuples. int is a fixed type, 3 the field’s shape. void is a flexible type, here of size 1050 dt=np.dtype([('hello',(np.int,3)),('world',np.void,10)])51 a=np.array([([1,2,3],'this is a')],dtype=dt)52 print a53 54 def main():55 dTypeTest()56 57 if __name__ == "__main__":58 main()

 

转载于:https://www.cnblogs.com/1zhk/p/4916589.html

你可能感兴趣的文章
EDAS再升级!全面支持Spring Cloud应用
查看>>
Linux下使用fdisk扩展分区容量
查看>>
Mesos+Marathon+zk+docker构建PaaS平台
查看>>
DataWorks2.0的“业务流程”与1.0的“工作流”的对比
查看>>
计算1-100之间数的和,计算其之间偶数的和
查看>>
299. Bulls and Cows - LeetCode
查看>>
Java抽象类
查看>>
在向HDFS中写数据的时候,当写某一副本时出错怎么处理?
查看>>
【Android Developer】1.一个关于Android机器人的故事
查看>>
模具常用术语中英文对照
查看>>
我管理的华为设备
查看>>
Ubuntu 11.10下安装google拼音
查看>>
稀疏矩阵的列序递增法和一次定位快速转置法
查看>>
在QTP中将WebTable的数据取出放入DataTable
查看>>
TCP传输协议抓包
查看>>
SVN服务搭建
查看>>
17款jQuery在线QQ客服代码分享
查看>>
Android ImageView使用网络资源文件
查看>>
让VIM记录文件上次编辑的位置
查看>>
Bootstrap V4 自学之路 文档目录
查看>>