2

以下は、Python ファイル PHP で乗算のために 2 つの行列を渡すために使用した python および php スクリプトです。

$arr2=array(array(array(1,2),array(3,5)) ,array(array(4,6)array(2,7)))
echo json_encode($arr2);
$rtu= shell_exec("C:/Python27/python 1234.py ".json_encode($arr2));
echo $rtu."\n";

パイソン:

import numpy as np
from numpy.core.umath_tests import matrix_multiply
from numpy import matrix
print json.loads(sys.argv[1])
arr=json.loads(sys.argv[1])
arr1=arr[0]
arr2=arr[1]
print arr1
print arr2
A=np.asmatrix(arr1)
print A
B=np.asmatrix(arr2)
print B
Z1 = matrix_multiply(A,B)

print json.dumps(Z1)

このコードは json_encode($arr2) に対して正しい出力を提供していますが、残りはすべて null になります。誰でもコードをデバッグできますか?

4

1 に答える 1

0

ここに部分的な解決策があります。投稿されたように機能していなかったpython側を修正しました。

まず、独自の関数を作成することで、PHP で行列を乗算できるはずだと思います。

PHP で行列乗算を行うのは、JSON や Python を処理したり、新しいプロセスを開始したり、データを前後に移動したりするのと同じくらい難しくありません。

http://pear.php.net/package/Math_Matrixには、行列乗算用の保守されていない PHP ライブラリがあります。

わかりましたので、この Rube-Goldberg っぽい方法でやりたい場合は、ここに修正された Python コードがあります。json と sys のインポート、および .tolist() を取得してマトリックスの結果をエンコードする必要がありました (json は単純な配列ではないため、マトリックスをそのままエンコードしません)。numpy.matrix の単体テスト ライブラリを破棄して、matrix_multiply の代わりにオーバーロードされた * を使用しました。

#!/usr/bin/python
import json
import sys
import numpy as np
from numpy import matrix
print json.loads(sys.argv[1])
arr=json.loads(sys.argv[1])
arr1=arr[0]
arr2=arr[1]
print arr1
print arr2
A=np.asmatrix(arr1)
print A
B=np.asmatrix(arr2)
print B
Z1 = A*B
print Z1
print json.dumps(Z1.tolist())

これはテスト プロトタイプです。「プロダクション」バージョンの場合、最後のプリントを除くすべてのプリントを削除する必要があります。

テスト走行:

./matrix_multiply.py "[[[2,0],[0,1]],[[1,3],[2,4]]]"
[[[2, 0], [0, 1]], [[1, 3], [2, 4]]]
[[2, 0], [0, 1]]
[[1, 3], [2, 4]]
[[2 0]
 [0 1]]
[[1 3]
 [2 4]]
[[2 6]
 [2 4]]
[[2, 6], [2, 4]]

うまく見えます。

私は 10 年以上 PHP を書いていないので、その部分は他の人に任せます。

于 2013-07-04T21:22:19.157 に答える