質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

【Cython】配列の宣言方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,488

Ryupe

score 353

Pythonのコードを高速化させようと思い、Cythonを使用してます。
Cythonについてはこちらを参考にさせてもらってます。

今、問題となっているのは一次配列の配列(python風にいうとリスト)の宣言が正常に出来ていないためプログラムが止まってしまうことです。Googleで調べてはいますけど、私の理解不足なのかイマイチ解決に至らないためここに質問させていただきます。

 コード

test.py

import numpy as np
import main

def hoge(loop):
    result = main.main(loop)

if __name__ == '__main__':
    ans = hoge(10)
    print(ans)


main.pyx

from __future__ import division
import numpy as np
cimport numpy as np
DTYPE = np.int
ctypedef np.int_t DTYPE_t

def main(int loop):

    cdef int i
    cdef np.ndarray ans = np.zeros(loop, dtype=DTYPE)

    for i in range(loop):
        ans[i] = 0

    return ans


setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy

ext_modules = [Extension('main', ['main.pyx'])]
setup(
    name         = 'main app',
    cmdclass     = {'build_ext':build_ext},
    ext_modules  = ext_modules
)

エラー文

Traceback (most recent call last):
  File "test.py", line 15, in <module>
    hoge(1000)
  File "test.py", line 10, in hoge
    result = main.main(loop)
  File "main.pyx", line 13, in main.main
    ans = [0 for i in range(loop)]
TypeError: Cannot convert list to numpy.ndarray

 スペック

Raspberry Pi 3 Model B
OS : 2017-11-29-raspbian-stretch

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

main関数のans = [0 for i in range(loop)]がおかしいので、

def main(int loop):

    cdef int i
    cdef np.ndarray ans = np.zeros(loop, dtype=DTYPE)

    for i in range(loop):
        ans[i] = 0

    return ans

とするべきところじゃないですかね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/08 00:13

    print(ans)だとNoneとでます。

    キャンセル

  • 2018/03/08 00:14

    return ansが抜けてませんか…?

    キャンセル

  • 2018/03/08 09:38

    度々返事が遅くなって申し訳ありません。
    test.pyのhoge関数がresult = になっていたのでこの部分を直したら正常に動きました。
    つまらないミスですみませんでした。

    キャンセル

0

test.pyのhoge関数の返り値のコーディングをミスっていました。
以下のようにしてやるとmain関数内で作成した配列を正常に受け取ることが出来ました。
dkato0077さんありがとうございました。

test.py

import numpy as np
import main

def hoge(loop):
    result = main.main(loop)

if __name__ == '__main__':
    ans = hoge(10)
    print(ans)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る