web-dev-qa-db-ja.com

numpyを使用してベクトルを転置する

Ipython-Numpyに問題があります。次の操作をしたい:

x^T.x

と formula 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を行列積として計算する方法を知っている人はいますか?

ありがとうございました!

13

他の人が説明しているように、転置は1D配列の場合のように「機能」しません。 np.atleast_2dを使用して、一貫性のある内積定義を作成することをお勧めします。

def vprod(x):
    y = np.atleast_2d(x)
    return np.dot(y.T, y)
7
Nathan

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]])
29
Jaime

私は同じ問題を抱えていました、私はそれを解決するために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行列を使用することは、コーディングの観点からデータを表すための最良の方法ではないかもしれませんが、多くの行列演算を実行する場合はかなり良い方法です。

4
david

手始めに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に投稿できますか?

1
JoshAdel

これは、割り当てた方向に応じて、2つのベクトルの内積または外積のいずれかになります。 xを変更せずにどちらかを計算する方法は次のとおりです。

import numpy
x = numpy.array([1, 2, 3])
inner = x.dot(x)
outer = numpy.outer(x, x)
1
chthonicdaemon
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)が解決策です。すぐに、[]はベクトルを行列に変換し、行列をより高次元のテンソルに変換します。

0
vesszabo

ファイル '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つがベクトルではなくスカラーになると予想します。

0