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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

5566閲覧

【Cython】配列の宣言方法

Ryupe

総合スコア426

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2018/03/07 07:50

編集2018/03/08 00:30

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

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

コード

test.py

python

1import numpy as np 2import main 3 4def hoge(loop): 5 result = main.main(loop) 6 7if __name__ == '__main__': 8 ans = hoge(10) 9 print(ans)

main.pyx

python

1from __future__ import division 2import numpy as np 3cimport numpy as np 4DTYPE = np.int 5ctypedef np.int_t DTYPE_t 6 7def main(int loop): 8 9 cdef int i 10 cdef np.ndarray ans = np.zeros(loop, dtype=DTYPE) 11 12 for i in range(loop): 13 ans[i] = 0 14 15 return ans

setup.py

python

1from distutils.core import setup 2from distutils.extension import Extension 3from Cython.Distutils import build_ext 4import numpy 5 6ext_modules = [Extension('main', ['main.pyx'])] 7setup( 8 name = 'main app', 9 cmdclass = {'build_ext':build_ext}, 10 ext_modules = ext_modules 11)

###エラー文

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

Python

1 2def main(int loop): 3 4 cdef int i 5 cdef np.ndarray ans = np.zeros(loop, dtype=DTYPE) 6 7 for i in range(loop): 8 ans[i] = 0 9 10 return ans

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

投稿2018/03/07 07:55

編集2018/03/07 08:26
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryupe

2018/03/07 08:09 編集

回答ありがとうございます。 コードを直して実行してみたところエラーが出ました。 おそらく、`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 08:14

ansは cdef np.ndarray ans = np.zeros(loop, dtype=DTYPE) これで確保してるのでは。
Ryupe

2018/03/07 08:31

うまくいきました。 ありがとうございます。
Ryupe

2018/03/07 09: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 09:14

print(ans)はどうなってます?
退会済みユーザー

退会済みユーザー

2018/03/07 09:27

np.ndarray()はどうして必要なんですか?
Ryupe

2018/03/07 15:13

print(ans)だとNoneとでます。
退会済みユーザー

退会済みユーザー

2018/03/07 15:14

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

2018/03/08 00:38

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

0

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

test.py

python

1import numpy as np 2import main 3 4def hoge(loop): 5 result = main.main(loop) 6 7if __name__ == '__main__': 8 ans = hoge(10) 9 print(ans)

投稿2018/03/08 00:37

Ryupe

総合スコア426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問