Ipython-Numpyに問題があります。次の操作をしたい:
x^T.x
と x ^ Tベクトルxの転置演算。 xは、次の命令でtxtファイルから抽出されます。
x = np.loadtxt('myfile.txt')
問題は、転置関数を使用すると
np.transpose(x)
形状関数を使用してxのサイズを知ると、xとx ^ Tで同じ寸法が得られます。 Numpyは、各寸法の後にLの大文字のインデックスが付いたサイズを示します。例えば.
print x.shape
print np.transpose(x).shape
(3L, 5L)
(3L, 5L)
これを解決し、x ^ T.xを行列積として計算する方法を知っている人はいますか?
ありがとうございました!
他の人が説明しているように、転置は1D配列の場合のように「機能」しません。 np.atleast_2d
を使用して、一貫性のある内積定義を作成することをお勧めします。
def vprod(x):
y = np.atleast_2d(x)
return np.dot(y.T, y)
np.transpose
は、形状タプルを逆にします。つまり、形状(m, n)
の配列をフィードし、形状(n, m)
の配列を返し、形状(n,)
...の配列を返し、shape(n,)
と同じ配列を返します。
暗黙のうちに期待しているのは、numpyが1Dベクトルを形状(1, n)
の2D配列として受け取り、それが(n, 1)
ベクトルに置き換えられることです。 Numpyはそれ自体ではそれを行いませんが、それがあなたが望むものであると言うことができます、例えば:
>>> a = np.arange(4)
>>> a
array([0, 1, 2, 3])
>>> a.T
array([0, 1, 2, 3])
>>> a[np.newaxis, :].T
array([[0],
[1],
[2],
[3]])
私は同じ問題を抱えていました、私はそれを解決するためにnumpy行列を使用しました:
# assuming x is a list or a numpy 1d-array
>>> x = [1,2,3,4,5]
# convert it to a numpy matrix
>>> x = np.matrix(x)
>>> x
matrix([[1, 2, 3, 4, 5]])
# take the transpose of x
>>> x.T
matrix([[1],
[2],
[3],
[4],
[5]])
# use * for the matrix product
>>> x*x.T
matrix([[55]])
>>> (x*x.T)[0,0]
55
>>> x.T*x
matrix([[ 1, 2, 3, 4, 5],
[ 2, 4, 6, 8, 10],
[ 3, 6, 9, 12, 15],
[ 4, 8, 12, 16, 20],
[ 5, 10, 15, 20, 25]])
Numpy行列を使用することは、コーディングの観点からデータを表すための最良の方法ではないかもしれませんが、多くの行列演算を実行する場合はかなり良い方法です。
手始めにL
は、型がlongintであることを意味します。これは問題にはならないはずです。単純なテストケースでは再現できないため、問題に関する追加情報を提供する必要があります。
In [1]: import numpy as np
In [2]: a = np.arange(12).reshape((4,3))
In [3]: a
Out[3]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In [4]: a.T #same as np.transpose(a)
Out[4]:
array([[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]])
In [5]: a.shape
Out[5]: (4, 3)
In [6]: np.transpose(a).shape
Out[6]: (3, 4)
問題を引き起こしているあなたの特定のケースで何か微妙なことが起こっている可能性があります。読んでいるファイルの内容をx
に投稿できますか?
これは、割り当てた方向に応じて、2つのベクトルの内積または外積のいずれかになります。 x
を変更せずにどちらかを計算する方法は次のとおりです。
import numpy
x = numpy.array([1, 2, 3])
inner = x.dot(x)
outer = numpy.outer(x, x)
b = np.array([1, 2, 2])
print(b)
print(np.transpose([b]))
print("rows, cols: ", b.shape)
print("rows, cols: ", np.transpose([b]).shape)
結果は
[1 2 2]
[[1]
[2]
[2]]
rows, cols: (3,)
rows, cols: (3, 1)
ここで(3、)は「(3,0)」と考えることができます。ただし、行列Aの転置が必要な場合は、np.transpose(A)が解決策です。すぐに、[]はベクトルを行列に変換し、行列をより高次元のテンソルに変換します。
ファイル 'myfile.txt'には、次のような行が含まれています。
5.100000 3.500000 1.400000 0.200000 1
4.900000 3.000000 1.400000 0.200000 1
これが私が実行するコードです:
import numpy as np
data = np.loadtxt('iris.txt')
x = data[1,:]
print x.shape
print np.transpose(x).shape
print x*np.transpose(x)
print np.transpose(x)*x
そして私は結果として得ます
(5L,)
(5L,)
[ 24.01 9. 1.96 0.04 1. ]
[ 24.01 9. 1.96 0.04 1. ]
X ^ T.x(またはx.x ^ T)はスカラーを与える必要があるため、最後の2つの結果の1つがベクトルではなくスカラーになると予想します。