Numpy自定义dtype的一个使用误区

2018-10-30  本文已影响0人  麒麟楚庄王

https://blog.csdn.net/jacke121/article/details/77345719

https://blog.csdn.net/sinat_35930259/article/details/79926270

https://blog.csdn.net/claroja/article/details/72896335

ndarray的属性

ndarray.ndim:数组的维数,也称为rank

ndarray.shape:数组各维的大小tuple 类型,对一个n 行m 列的矩阵来说, shape 为 (n,m)。

ndarray.size:元素的总数。

Ndarray.dtype:每个元素的类型,可以是 numpy.int32, numpy.int16, and numpy.float64 等。

Ndarray.itemsize:每个元素占用的字节数。

Ndarray.data:指向数据内存。

opencv处理用的nparray,dtype为 np.uint8

Numpy 数组和dtype的一个使用误区

dt1=np.dtype(np.int32) 

dt2=np.dtype([('f1', np.int32)])

dt3=np.dtype([('f1', np.int32), ('f2', np.int32)]) 

首先自定义三种类型(如下代码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行是一样的。

上一篇下一篇

猜你喜欢

热点阅读