2

を使用して Matlab からこのデータ ファイルをインポートした後scipy.io.loadmat、行列の 1 つの条件付け数を計算しようとするまで、問題なく動作しているように見えました。

再現するコードの最小量は次のとおりです。

import scipy
import numpy

stuff = scipy.io.loadmat("dati-esercizio1.mat")
numpy.linalg.cond(stuff["A"])

iPython の厚意により拡張されたスタック トレースを次に示します。

In [3]: numpy.linalg.cond(A)
---------------------------------------------------------------------------
LapackError                               Traceback (most recent call last)
/snip/<ipython-input-3-15d9ef00a605> in <module>()
----> 1 numpy.linalg.cond(A)

/snip/python2.7/site-packages/numpy/linalg/linalg.py in cond(x, p)
   1409     x = asarray(x) # in case we have a matrix
   1410     if p is None:
-> 1411         s = svd(x,compute_uv=False)
   1412         return s[0]/s[-1]
   1413     else:

/snip/python2.7/site-packages/numpy/linalg/linalg.py in svd(a, full_matrices, compute_uv)
   1313         work = zeros((lwork,), t)
   1314         results = lapack_routine(option, m, n, a, m, s, u, m, vt, nvt,
-> 1315                                  work, -1, iwork, 0)
   1316         lwork = int(work[0])
   1317         work = zeros((lwork,), t)

LapackError: Parameter a has non-native byte order in lapack_lite.dgesdd

すべての明らかなアイデア (マトリックスを平坦化して再形成する、マトリックスをゼロから再作成して要素ごとに再割り当てするなど) は失敗しました。それでは、numpy でより快適にするために、データをマッサージするにはどうすればよいでしょうか?

4

3 に答える 3

2

これはバグで、しばらく前に修正されました: https://github.com/numpy/numpy/pull/235

回避策:

np.linalg.cond(stuff['A'].newbyteorder('='))
于 2012-10-29T20:55:01.690 に答える
1

これは私のために働く:

In [33]: stuff = loadmat('dati-esercizio1.mat')

In [34]: a = stuff['A']

In [35]: try: np.linalg.cond(a)
   ....: except: print "Fail!"
Fail!

In [36]: b = np.array(a, dtype='>d')

In [37]: np.linalg.cond(b)
Out[37]: 62493201976.673141

In [38]: np.all(a == b)  # Verify they hold the same data.
Out[38]: True
于 2012-10-29T15:13:05.793 に答える
-1

どうやら、ndarray オブジェクト自体だけでなく、結果の ndarray 内の各数値のバイト順 (エンディアン?) に何か問題があるようです。

このようなものですが、よりエレガントな方法でうまくいくはずです:

n, m = A.shape()
B = numpy.empty_like(A)

for i in xrange(n):
  for j in xrange(m):
    B[i,j] = float(A[i,j])

del A
B = A

print numpy.linalg.cond(A) # 62493210091.354507

(何らかの理由で、インプレース置換でもそのエラーが発生するため、オブジェクト全体のバイト順にも問題があります。)

于 2012-10-29T14:06:20.280 に答える