numpy.asarray在cython memoryview中失败
我在使用numpy.asarray和memoryview对象时遇到了一些奇怪的行为,我无法解释。下面是一个在jupyter笔记本中使用cython魔法的简单示例——我只需创建一个函数,该函数需要两个结构数组缓冲区并返回它们。一个有两个整数,另一个有一个长整数和一个整数:numpy.asarray在cython memoryview中失败,numpy,cython,memoryview,Numpy,Cython,Memoryview,我在使用numpy.asarray和memoryview对象时遇到了一些奇怪的行为,我无法解释。下面是一个在jupyter笔记本中使用cython魔法的简单示例——我只需创建一个函数,该函数需要两个结构数组缓冲区并返回它们。一个有两个整数,另一个有一个长整数和一个整数: cdef struct S1: int iGroup int iOrder cdef struct S2: long iGroup int iOrder def test_struct(S1[
cdef struct S1:
int iGroup
int iOrder
cdef struct S2:
long iGroup
int iOrder
def test_struct(S1[:] s1, S2[:] s2):
return s1, s2
现在,我用python制作了两个数组来传递给这个函数:
dt1 = np.dtype([('iGroup', 'i4'), ('iOrder', 'i4')], align=True)
dt2 = np.dtype([('iGroup', 'i8'), ('iOrder', 'i4')], align=True)
a = np.zeros(10, dtype=dt1)
b = np.zeros(10, dtype=dt2)
x, y = test_struct(a,b)
print x
print y
<MemoryView of 'ndarray' object>
<MemoryView of 'ndarray' object>
dt1=np.dtype([('iGroup','i4'),('iOrder','i4')],align=True)
dt2=np.dtype([('iGroup','i8'),('iOrder','i4')],align=True)
a=np.0(10,dtype=dt1)
b=np.0(10,dtype=dt2)
x、 y=测试结构(a,b)
打印x
打印y
两者都作为MemoryView对象成功返回。现在我想把它们变成一个numpy数组:
np.asarray(x)
array([(0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0),
(0, 0), (0, 0)],
dtype=[('iGroup', '<i4'), ('iOrder', '<i4')])
np.asarray(y)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-204-ca5459515bfd> in <module>()
----> 1 np.asarray(y)
/Users/rok/miniconda/lib/python2.7/site-packages/numpy/core/numeric.pyc in asarray(a, dtype, order)
480
481 """
--> 482 return array(a, dtype, copy=False, order=order)
483
484 def asanyarray(a, dtype=None, order=None):
TypeError: expected a readable buffer object
np.asarray(x)
数组([(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),
(0, 0), (0, 0)],
dtype=[('iGroup','您是否尝试过将结构定义为cdef-packed-struct
?感谢@DavidW的建议,似乎可以解决这个问题——但为什么?我不是100%确定。它的文档似乎相对较差。这里有一些旧文档,但当前文档中似乎缺少了它,请参阅(align
).Right…我使用的是aligned=True
,因为我在打包结构的其他地方遇到了问题。错误(应为可读的缓冲区对象)似乎很神秘。您是否尝试过将结构定义为cdef-packed-struct
?感谢@DavidW的建议,似乎可以解决这个问题——但原因是什么?我不是100%确定。它的文档记录似乎相对较差。这里有一些旧文档,但当前文档中似乎缺少它,请参阅(align
).对…我使用的是aligned=True
,因为我在其他地方遇到了打包结构的问题。错误(应该是可读的缓冲区对象)看起来非常神秘。