2017-08-17 19 views
4

私のコードは、ユーザーが開始状態に適用されるカスタムマトリックスを作成するためのものです。ユーザーが望むあらゆる正方行列を生成できるようにしたいので、私はいくつかのファンキーなことをする必要があります。私の基本的なアプローチは、ユーザーに1つのリストに入れられるさまざまな要素を入力させることでした。リスト内の要素の位置に基づいて、それらは異なる行に配置されます。私はnumpy.append()を使ってこれを行います。しかし、それは私の.append()ラインに応じて、エラーマトリックスが正しく追加されていません

Traceback (most recent call last): 
    File "/home/physicsnerd/Documents/Quantum-Computer-Simulator/tests.py", line 39, in <module> 
    customop(qstat) 
    File "/home/physicsnerd/Documents/Quantum-Computer-Simulator/tests.py", line 21, in customop 
    np.append(matrix,current_row,axis=0) 
    File "/usr/lib/python3/dist-packages/numpy/lib/function_base.py", line 4575, in append 
    return concatenate((arr, values), axis=axis) 
ValueError: all the input arrays must have same number of dimensions 

を与えています。私は間違って何をしていますか?

このコードケースでエラーを再現するには、「2」と入力し、「0」と入力し、「1」と入力し、「1」と入力して「0」と入力します。最後の4つの数字の間でもう1つの注意 - print(current_row)行はデバッグ参照のためのものです。 print(matrix)行と同じです。

コード上記の指定された入力が与えられると

import numpy as np 
import math 

def customop(qstat): 
    dimensions = float(input("What are the dimensions of your (square) matrix? Please input a single number: ")) 
    iterator = 1 
    iterator_2 = 1 
    elements = [] 
    while iterator <= dimensions: 
     while iterator_2 <= dimensions: 
      elements.append(float(input("Matrix element at "+str(iterator)+","+str(iterator_2)+": "))) 
      iterator_2+=1 
     iterator_2 = 1 
     iterator+=1 
    matrix = np.matrix([]) 
    element_places = list(range(len(elements))) 
    current_row = [] 
    for i in element_places: 
     print(i%dimensions) 
     if i%dimensions == 0 and i > 0:#does this work? column vs row, elements, etc 
      np.append(matrix,current_row,axis=0) 
      current_row = [] 
      current_row.append(elements[i]) 
     elif i == 0: 
      current_row.append(elements[i]) 
      print(current_row) 
     else: 
      current_row.append(elements[i]) 
      print(current_row) 
    if np.array_equal(np.dot(matrix, matrix.conj().T), np.identity(2)) == True: 
     print(matrix) 
     return np.dot(matrix, qstat) 
    else: 
     print(matrix) 
     print("matrix not unitary, pretending no gate was applied") 
     return qstat 

qstat = np.matrix([[0],[1]]) 
customop(qstat) 
+0

完全なエラーメッセージを記載してください。 – DyZ

+0

@DYZ編集しました。 – heather

+0

あなたは今、 '行列'の次元を先取りしていますか?なぜ完全な行列広告を作成しても、単に 'elements [i]'を 'append'sなしで正しい位置に格納するのはなぜですか? – DyZ

答えて

3

(サイズ2の要素0、1、1、0)、エラーは、の行を追加しようとしているという事実から来ています2要素を空の行列に置き換えます。 np.arrayに変換された場合、あなたの(空の)マトリックスはシェイプ(1,0)を持ち、current_rowはシェイプ(2、)を持ちます。あなただけの正方行列にご入力の形を変えることができるように

np.matrix(elements).reshape((int(dimensions), int(dimensions))) 

を次のように

DYZは、前述したように、あなたはすでにあなたが要素を求めるためには、デフォルトの方法リシェイプに合わせているので、あなたの行列の大きさを知っています機能が動作する場合、追加する必要はありません。フロートとして寸法を解析するので、上記の整数にキャストしなければなりませんでした。

このように単純化された、のようになり、あなたのコードは次のとおりです。

# matrix.py 

import numpy as np 
import math 

def customop(qstat): 
    dimensions = int(input("What are the dimensions of your (square) matrix? Please input a single number: ")) 
    iterator = 1 
    iterator_2 = 1 
    elements = [] 
    while iterator <= dimensions: 
     while iterator_2 <= dimensions: 
      elements.append(float(input("Matrix element at "+str(iterator)+","+str(iterator_2)+": "))) 
      iterator_2+=1 
     iterator_2 = 1 
     iterator+=1 
    matrix = np.matrix(elements).reshape(dimensions, dimensions) 
    if np.array_equal(np.dot(matrix, matrix.conj().T), np.identity(2)) == True: 
     print(matrix) 
     return np.dot(matrix, qstat) 
    else: 
     print(matrix) 
     print("matrix not unitary, pretending no gate was applied") 
     return qstat 

qstat = np.matrix([[0],[1]]) 
customop(qstat) 

出力例

$ python3 matrix.py 
What are the dimensions of your (square) matrix? Please input a single number: 3 
Matrix element at 1,1: 1 
Matrix element at 1,2: 2 
Matrix element at 1,3: 3 
Matrix element at 2,1: 1 
Matrix element at 2,2: 2 
Matrix element at 2,3: 3 
Matrix element at 3,1: 1 
Matrix element at 3,2: 2 
Matrix element at 3,3: 3 
[[ 1. 2. 3.] 
[ 1. 2. 3.] 
[ 1. 2. 3.]] 

追加の最適化

あなたの行列は正方形になります知っている場合は、あなたがいることを推測することができます次元は入力要素の数の平方根になります

dimensions = math.sqrt(len(elements)) 

これはおそらくエラー処理を複雑にし、UXに影響することに注意してください。

側注

あなたは何が起こっているかを確認するために使用できる便利なツールがipdbです。私は右のあなたの元np.append行の前の行に

import ipdb; ipdb.set_trace() 

を落とし、それは私があなたのエラーを強調助けたものです。

3

私が正しくあなたを理解している場合、行列の次元を決定し、ユーザから値を追加し、リストのサイズを変更して行列に変換することは動作するはずです:

次元= INT(入力(「寸法は何ですかあなたの(正方形)マトリックスの?「))

ls = [] 
for y in range(dimension): 
    for x in range(dimension): 
     ls.append(float(input('What value for position ({}, {}): '.format(y+1, x+1)))) 

np.matrix(np.resize(ls, (dimension, dimension))) 

出力:あなたのアプローチはあなたにそのエラーを投げている理由

What are the dimensions of your (square) matrix? Please input a single number: 3 
What value for position (1, 1): 1 
What value for position (1, 2): 2 
What value for position (1, 3): 3 
What value for position (2, 1): 1 
What value for position (2, 2): 2 
What value for position (2, 3): 3 
What value for position (3, 1): 1 
What value for position (3, 2): 2 
What value for position (3, 3): 3 

Out[29]: 
matrix([[ 1., 2., 3.], 
     [ 1., 2., 3.], 
     [ 1., 2., 3.]]) 
1

他の人が指摘してきた私はちょうどあなたが作成することができます別の方法を追加します入力単一番号してください。あなたの行列。そのエントリで、あなたがエントリを求める前に、あなたが(そしてそれは常に正方行列です)、ユーザーからの寸法を取得する。だから、あなたがゼロのマトリックスを作成することができ、その後、あなたが行くようにそれを埋めることに注意してください

def customop(qstat): 
    dimensions = input("What are the dimensions of your (square) matrix? Please input a single number: ") 
    matrix = np.zeros([dimensions, dimensions]) 

    for iterator in range(dimensions): 
     for iterator_2 in range(dimensions): 
      matrix[iterator, iterator_2] = float(input("Matrix element at "+str(iterator)+","+str(iterator_2)+": ")) 

    if np.array_equal(np.dot(matrix, matrix.conj().T), np.identity(2)) == True: 
     print(matrix) 
     return np.dot(matrix, qstat) 
    else: 
     print(matrix) 
     print("matrix not unitary, pretending no gate was applied") 
     return qstat 

qstat = np.matrix([[0],[1]]) 
customop(qstat) 
:ユーザーはそうのように、あなたを与えます

whileループをforループに置き換えて、初期化とインクリメントが自動的に処理されるようにしました。

0

わかりましたので、取り扱われ、そのうちのいくつかを持っていないされているそのうちのいくつかはここで起こっあり、いくつかの異なるもの、。

まず最初に、@DYZで指摘したように、あなたが空行列にベクトルを行に追加しようとしているということです。これは、空行列を再形成することによって解決することができます。私はあなたが使用して、あなたは次元を求めるとき、あなたがすべきことはなかったというimport math文を削除した

import numpy as np 

def custom_operator(state): 
    dimension = int(input("What are the dimensions of your (square) matrix? Please input a single number:")) 
    elements = list() 
    for x in range(dimension): 
     for y in range(dimension): 
      value = float(input("Matrix element at ({x}, {y}):".format(x=x+1, y=y+1))) 
      elements.append(value) 

    operator = np.matrix(np.resize(elements, (dimension, dimension))) 
    output_state = np.dot(operator, state) 
    return output_state 

state = np.matrix([[0], [1]]) 
custom_operator(state) 

注:

コードも大幅に何かのようにして簡略化することができます浮動小数点ではなくintへの応答をキャストしてください。

これは、ゲートが、一体であるかどうかをチェックするためにも、本当に必要はありません。どちらの方法でも、操作の出力を状態に戻します。 (あなたが本当に知りたい場合を除き、それはだった場合。)寸法は2でない場合、あなたはより良いチェックがしかし

np.allclose(operator.dot(operator.T.conj()), np.eye(len(dimension))) 

だろうけれども、あなたの現在のチェックが失敗したくない場合は、与えられたあなたがしたいことどんなゲートをあなたの州に適用するには、行列の次元が何であるか知っています。キュービット状態にqutritゲートを適用することをユーザーが指定できるようにするだけで、エラーが発生する可能性があります。だから、コードのより良いバージョンは、次のようになります。

import numpy as np 

def custom_operator(input_state): 
    dimension, width = input_state.shape 

    if width != 1: 
     error_message = "Input state must be a column vector" 
     raise ValueError(error_message) 

    elements = list() 
    for x in range(dimension): 
     for y in range(dimension): 
      value = float(input("Matrix element at ({x}, {y}):".format(x=x+1, y=y+1))) 
      elements.append(value) 

    operator = np.matrix(np.resize(elements, (dimension, dimension))) 
    output_state = np.dot(operator, input_state) 
    return output_state 

state = np.matrix([[0], [1]]) 
custom_operator(state) 

また、あなたは、ゲートシミュレーションのこれらの種類を行うには、すでにそれらについて知らなかった場合は、必ずall_closereshapeをチェックしたい場合。彼らはたくさん出てくるだろう。

関連する問題