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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

560閲覧

Cythonで、numpyを使って文字列を含むファイルを読み込みたい

nacho

総合スコア0

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/09/23 04:09

編集2022/09/23 06:19

PyhonからCythonで書いたコードを呼び出して実行しています。
Cythonでは、文字列を含むスペース区切りのファイルを読み込み、
読み込んだデータをNumpy関数を使用して2次元配列として取り込もうと考えています。

実現したいこと

文字列を含む2次元配列(ndarray)を取り込む際にcdefで型宣言することで高速化を図りたいです。
高速に実行できるのであれば、Numpyを使用しない方法などの異なるアプローチでも構いませんので、
何かいい方法があればご教授願えないでしょうか。

発生している問題・エラーメッセージ

Cdefの宣言文を追加すると実行時に以下のエラーメッセージが発生しました。
(コンパイルを行い、.c、.pydファイルまではできています)

エラーメッセージ
Does not understand character buffer dtype format string ('w')

ソースコード

Cyhonソースコード(module_cython.pyx)

cython

1import numpy as np 2cimport numpy as cnp 3cimport cython 4 5ctypedef cnp.unicode DTYPE_U_t #Numpyのデータタイプを宣言 --① 6 7def fileread_cython(filepath): 8 cdef cnp.ndarray[DTYPE_U_t, ndim=2] data #deta変数を型宣言 --② 9 data = np.loadtxt(filepath, dtype = "unicode", delimiter = ' ') #csv(TSV)ファイルを読み込み 10 11 return data

呼び出し側のPythonソースコード(main.py)

python

1from module_cython import fileread_cython 2 3filepath = "C:/test/test.csv" 4 5print(fileread_cython(filepath))

試したこと

上のソースコードで①、②をコメントアウトすれば動作しますので、
unicodeとして型宣言している部分の周囲が何か間違っていると考えています。

補足情報(FW/ツールのバージョンなど)

ツール  ver.
Python  3.10
Cython  0.29.32
numpy  1.23.2

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

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

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

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

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

jbpb0

2022/09/23 05:30

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください または、 https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif を見て、そのようにしてみてください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
nacho

2022/09/23 05:59

ソースコード後半(Pythonソースコード部分)をコメントアウトさせていただきました。 初めての投稿だったものでご指摘助かります。
jbpb0

2022/09/23 06:09

「'''」ではなく「```」です キーボード入力すると間違えるので、このコメントからコピペしてください
nacho

2022/09/23 06:21

失礼いたしました。 ```でソースコードがまとまるのですね。助かりました。
jbpb0

2022/09/23 06:25

そうすれば、インデントが消えなくなり、他人がコードを正確に把握できます
bsdfan

2022/09/23 07:08

読み込んだ data の shape, dtype はどんな値ですか?(コメントアウトしてエラーを出さないときの) ただ、numpy.loadtxt() の動作を高速化したいという意図でしたら、cythonの中から呼んでも、変数の型を指定しても効果はないと思われます。なんらかの後続の処理があって、その部分を高速化したいのならば、その部分だけをcythonの関数にするのがいいように思います。
nacho

2022/09/23 09:48

コメントありがとうございます。 Visual studioで開発しているのですが、shape, dtypeの値は以下のように表示されています。 shape=(580,656) dtype=dtype('<U2') 実際の処理ではこのデータを基に1byte→2byte化や16進数→10進数変換などを加えて16bit tiffファイルを生成します。また、ファイルは一つではなく例えば100ファイル程度を繰り返すことになります。 後処理に入る前にdata取得に時間が掛かっている様子だったので高速化できないかと考えた次第です。
bsdfan

2022/09/25 10:15

data取得の時間についてでしたら、numpy.loadtxt() は遅いというのがよく言われます。そこをpandasに変えるとか、いっそのことopenと内包表記とsplit() にしてしまうほうが速くなります。 エラーについては、cythonでunicodeのndarrayをいじったことがないので、よくわかりません。検索でも出てこないですね。objectの配列にするか、エンコードしてcharの配列にしてからcythonで処理するほうがいいのかもしれないです。
jbpb0

2022/09/26 01:13 編集

https://stackoverflow.com/questions/35698179/cython-storing-unicode-in-numpy-array の回答の最後に、unicode arrayをarray of int32として扱う例があり、 「Cython gives you the greatest speed improvement when you can bypass Python functions and methods. That would include bypassing much of the Python string and unicode functionality.」 と書かれてます この質問の条件に合致するかは分かりませんが、参考までにお知らせします 【追記】 上記Webページの内容はunicodeのnumpy arrayをどう扱うかというもので、この質問のファイルを読み込むにはどうするのかとは違うので、関係無いかもしれません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問