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

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

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

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

String

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

Unicode

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

Python

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

受付中

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

nacho
nacho

総合スコア0

NumPy

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

String

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

Unicode

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

Python

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

0回答

0評価

0クリップ

166閲覧

投稿2022/09/23 04:09

編集2022/09/26 10:13

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

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

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

python

from module_cython import fileread_cython filepath = "C:/test/test.csv" print(fileread_cython(filepath))

試したこと

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

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

ツール  ver.
Python  3.10
Cython  0.29.32
numpy  1.23.2

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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をどう扱うかというもので、この質問のファイルを読み込むにはどうするのかとは違うので、関係無いかもしれません

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

NumPy

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

String

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

Unicode

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

Python

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