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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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
とするべきところじゃないですかね。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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で質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/03/07 17:07 編集
コードを直して実行してみたところエラーが出ました。
おそらく、`ans`という変数が宣言されていないからだと思います。
以下エラー文。
```python
running build_ext
cythoning main.pyx to main.c
Error compiling Cython file:
------------------------------------------------------------
...
#ans = [0 for i in range(loop)]
cdef int i
for i in range(loop):
ans[i] = 0
^
------------------------------------------------------------
main.pyx:17:8: undeclared name not builtin: ans
building 'main' extension
arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fdebug-prefix-map=/build/python3.5-RUbMX3/python3.5-3.5.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.5m -c main.c -o build/temp.linux-armv7l-3.5/main.o
main.c:1:2: error: #error Do not use this file, it is the result of a failed Cython compilation.
#error Do not use this file, it is the result of a failed Cython compilation.
^~~~~
error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
```
2018/03/07 17:14
cdef np.ndarray ans = np.zeros(loop, dtype=DTYPE)
これで確保してるのでは。
2018/03/07 17:31
ありがとうございます。
2018/03/07 18:12
loopを10にしてmain関数の中「ans」をprintすると
[0 0 0 0 0 0 0 0 0 0]
と表示されます。
ここまではいいのですが、test.pyでprintするとエラーもしくはでかい数字が表示されます。
おそらくビットがあってないからだと思います。
https://deepage.net/features/numpy-dtype.html
自分なりにいろいろ試してみましたがどれもうまくいきませんでした。
■test.py
if __name__ == '__main__':
ans = hoge(10)
print(np.ndarray(ans, dtype = np.int))
■実行結果
24708752
2018/03/07 18:14
2018/03/07 18:27
2018/03/08 00:13
2018/03/08 00:14
2018/03/08 09:38
test.pyのhoge関数がresult = になっていたのでこの部分を直したら正常に動きました。
つまらないミスですみませんでした。