1

説明できない memoryview オブジェクトで numpy.asarray を使用すると、奇妙な動作に遭遇しました。これは、jupyter ノートブックで cython マジックを使用した簡単な例です。単純に、2 つの構造体配列バッファーを想定してそれらを返す関数を作成します。一方には 2 つの int があり、もう一方には long と int があります。

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 で 2 つの配列を作成して、この関数に渡します。

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>

どちらも 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

ここで何が欠けていますか?この 2 番目の構造体が機能しないのはなぜですか? どんなヒントでも大歓迎です!

4

0 に答える 0