5

私は私がまとめた次の文字列を持っています:

v1fColor = '2,4,14,5,0,0,0,0,0,0,0,0,0,0,12,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,6,0,0,0,0,1,0,0,0,0,0,0,0,0,0,20,9,0,0,0,2,2,0,0,0,0,0,0,0,0,0,13,6,0,0,0,1,0,0,0,0,0,0,0,0,0,0,10,8,0,0,0,1,2,0,0,0,0,0,0,0,0,0,17,17,0,0,0,3,6,0,0,0,0,0,0,0,0,0,7,5,0,0,0,2,0,0,0,0,0,0,0,0,0,0,4,3,0,0,0,1,1,0,0,0,0,0,0,0,0,0,6,6,0,0,0,2,3'

私はそれをベクトルとして扱っています:長い話は画像ヒストグラムの前色を短くします:

2つの画像のコサイン類似度を計算する次のラムダ関数があるので、これをnumpy.arrayに変換しようとしましたが、失敗しました。

これが私のラムダ関数です

import numpy as NP
import numpy.linalg as LA
cx = lambda a, b : round(NP.inner(a, b)/(LA.norm(a)*LA.norm(b)), 3)

そこで、この文字列をnumpy配列として変換するために、次のことを試みました。

v1fColor = NP.array([float(v1fColor)], dtype=NP.uint8)

しかし、私は次のエラーを受け取ることになりました:

    v1fColor = NP.array([float(v1fColor)], dtype=NP.uint8)
ValueError: invalid literal for float(): 2,4,14,5,0,0,0,0,0,0,0,0,0,0,12,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,6,0,0,0,0,1,0,0,0,0,0,0,0,0,0,20,9,0,0,0,2,2,0,0,0,0,0,0,0,0,0,13,6,0,0,0,1,0,0,0,0,0,0,0,0,0,0,10,8,0,0,0,1,2,0,0,0,0,0,0,0,0,0,17,17,
4

4 に答える 4

10

最初に文字列をコンマで分割する必要があります。

NP.array(v1fColor.split(","), dtype=NP.uint8)
于 2012-07-31T19:03:40.530 に答える
6

あなたはこれを行うことができます:

lst = v1fColor.split(',')  #create a list of strings, splitting on the commas.
v1fColor = NP.array( lst, dtype=NP.uint8 ) #numpy converts the strings.  Nifty!

またはより簡潔に:

v1fColor = NP.array( v1fColor.split(','), dtype=NP.uint8 )

次のことを行うのがもう少し習慣的であることに注意してください。

import numpy as np

に比べimport numpy as NP

編集

ちょうど今日、私はnumpy.fromstringこの問題を解決するためにも使用できる関数について学びました:

NP.fromstring( "1,2,3" , sep="," , dtype=NP.uint8 )
于 2012-07-31T19:03:57.703 に答える
6

Python文字列メソッドを使用せずにこれを行うことができます-try numpy.fromstring

>>> numpy.fromstring(v1fColor, dtype='uint8', sep=',')
array([ 2,  4, 14,  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  4,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  6,  0,  0,
        0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20,  9,  0,  0,  0,
        2,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13,  6,  0,  0,  0,  1,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  8,  0,  0,  0,  1,  2,
        0,  0,  0,  0,  0,  0,  0,  0,  0, 17, 17,  0,  0,  0,  3,  6,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  7,  5,  0,  0,  0,  2,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  4,  3,  0,  0,  0,  1,  1,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  6,  6,  0,  0,  0,  2,  3], dtype=uint8)
于 2012-07-31T19:37:52.580 に答える
0

私はこの答えを書いているので、将来の参考のために:この場合の正しい解決策はわかりませんが、@ David Robinsonが最初に公開したものが、1つの理由のために正しい答えだったと思います:コサイン類似性の値は1つは、オプションを使用NP.array(v1fColor.split(","), dtype=NP.uint8)すると、2つのベクトル間のコサイン類似度に対して1.0を超えるストラテジー値を取得します。

そこで、試してみるための簡単なサンプルコードを作成しました。

import numpy as np
import numpy.linalg as LA

def testFunction():
    value1 = '2,3,0,80,125,15,5,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'
    value2 = '2,137,0,4,96,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0'
    cx = lambda a, b : round(np.inner(a, b)/(LA.norm(a)*LA.norm(b)), 3)
    #v1fColor = np.array(map(int,value1.split(',')))
    #v2fColor =  np.array(map(int,value2.split(',')))
    v1fColor = np.array( value1.split(','), dtype=np.uint8 )
    v2fColor = np.array( value2.split(','), dtype=np.uint8 )
    print v1fColor
    print v2fColor
    cosineValue = cx(v1fColor, v2fColor)
    print cosineValue

if __name__ == '__main__':
    testFunction()

このコードを実行すると、次の出力が得られるはずです。 ここに画像の説明を入力してください

コメントなしの2行を許可せず、Davidの初期ソリューションでコードを実行します。

v1fColor = np.array(map(int,value1.split(',')))
v2fColor =  np.array(map(int,value2.split(','))) 

上記のように、コサイン類似度の値は1.0を超えていることに注意してください。ただし、map関数を使用してintキャストを使用すると、正しい値である次の値が得られます。

ここに画像の説明を入力してください

幸運なことに、最初に取得した値をプロットしていて、いくつかのコサイン値が1.0を超えていました。これらのベクトルの出力を取得し、Pythonコンソールに手動で入力し、ラムダ関数を介して送信し、正しい答えを得たので、非常に混乱していました。次に、何が起こっているかを確認するためのテストスクリプトを作成し、この問題を見つけてよかったです。私はPythonの専門家ではなく、2つの方法で何が起こっているのかを正確に伝えて2つの異なる答えを出します。しかし、私はそれを@DavidRobinsonまたは@mgilsonのどちらかに任せます。

于 2012-08-01T18:03:32.843 に答える