問題タブ [memoryview]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
486 参照

string - cython - numpy 配列から文字列を操作する

文字列を含む numpy 配列でメモリ ビューを生成する際に問題があります。最終的な目標は、文字列を整数に変換することです。strtokその間に、ポインターを引数として取るc 関数を使用して、適切な場所で文字列を分割する必要があります。したがって、単純に numpy 配列から要素を渡すことはできませんが、ここで説明するようにメモリ ビューを作成する必要があります。

これが私のコードです

pxyファイルはコンパイルされますが、このように使用しようとすると

次の行でエラーが発生しますchar[::1] arr_memview = string_array: ValueError: Buffer dtype mismatch, expected end but got a string。(途中でさらにエラーが発生する可能性があります。)

私の問題に対する答えは何らかの形でここに提供されていると思いますが、コードを機能させるのに十分なほどよく理解していません。たとえば、問題のある行をchar[:,::1] arr_memview = string_arrayに変更し、ループの最初の行を に変更するとtoken = strtok(&arr_memview[i,0], ':')、エラーが発生しますValueError: Buffer has wrong number of dimensions (expected 2, got 1)

0 投票する
1 に答える
211 参照

python - Memoryview の規範 - Cython

memoryview ベクトルが与えられた関数があり、そのベクトルのノルムを計算したいと考えています。これまでは、memoryview を Numpy 配列に変換し、 を介してノルムを計算することでそれを達成しましたnp.sqrt(V.dot(V))。速度の理由からそのステップを取り除きたいのですが、次の実装のある時点でプログラムが失敗します。

この理由は、十分に大きなベクトルの邪魔になる浮動小数点演算にあると思われます。Cython メモリビューのノルムを計算する数値的に安定した方法はありますか?

アップデート

チェックすると、丸め誤差はおそらく無意味であることがわかります。代わりに、本当に奇妙なことが起こっています。私の実際の機能は次のようになります。

print結果が「どれだけ等しいか」をチェックするステートメントを挿入しましnormた。奇妙なことは、上記のコードが立っているように、すべてが正常に機能するようになったことです。しかし、最初の print ステートメント (1 行目) をコメントアウトすると、コードは関数を正常に実行しますが、プログラムの直後に失敗します。そこで何が起こっているのですか?これは、他の操作に影響を与えるべきではない単なるprintステートメントではありませんか?

更新 2

最小限の、完全で検証可能な例での私の試みは次のとおりです。

そのコードが何をするのかを理解する必要はないと思います。私にとっての謎は、そのprint声明がなぜ違いを生むのかということです。

したがって、このコードが想定しているのは、行列 A の列ベクトルとして記述された非正規直交ベクトル セットを取得し、次のようにベクトル セットを正規直交正規化する正規直交行列を返すことです。

コード スタイルの正規直交化の式

したがって、A_{orthonormal} はコードの X 行列に相当します。直交正規行列の転置を直交正規行列自体で乗算すると、単一行列が得られます。これは、print# line1 ステートメントがそこにある限り得られるものです。それを削除するとすぐに、行列が直交していないことを意味する対角外のエントリも取得されます。なんで?