美文网首页
Numpy自定义dtype的一个使用误区

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

作者: 麒麟楚庄王 | 来源:发表于2018-10-30 23:50 被阅读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行是一样的。

    相关文章

      网友评论

          本文标题:Numpy自定义dtype的一个使用误区

          本文链接:https://www.haomeiwen.com/subject/wpxotqtx.html