質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

441閲覧

配列の行列を入れ替えて表示したい.(python)

tomokomomoko

総合スコア10

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/19 09:08

###初めに
python初心者です.自分なりに調べてやってみて質問させていただいております.
わかりにくいところ,拙い点はございますが,ご容赦くださいますと幸いです.
何卒ご教授いただきたいです.
###参考文献
https://qiita.com/shizuma/items/b0752fd4cd39583d7e54

実現したいこと

1.max_weightの値を4,8,12...のように順番に入れて,下記のsummaryのように
複数の結果を出したい.

2.出力結果の行と列を入れ替えて表示したい

summary

1x2,x1,x4,x3 21, 1, 1, 0 31, 1, 0, 1 41, 1, 1, 1 51, 1, 1, 1

3.上記の結果をcsvで出力したいのですが.xxxの部分をどうすればよいでしょうか?

np.savetxt( "sample.csv", xxx, "%0.0f", delimiter=",", header="x1 x2 x3 x4", )

該当のソースコード

python

1import numpy as np 2from pandas import DataFrame 3import copy 4 5class BranchAndBound: 6 def __init__(self, weights, values, max_weight, answer_val): 7 self.weights = np.array(weights) 8 self.values = np.array(values) 9 self.max_weight = max_weight 10 self.answer_val = answer_val 11 self.evaluates = self.values/self.weights 12 self.index_list = [] 13 for index in range(1, len(weights) + 1): 14 self.index_list.append('x' + str(index)) 15 self.target_df = DataFrame(np.c_[self.evaluates, self.weights, self.values, np.array(self.answer_val)], index=self.index_list, columns=["evaluate", "weight", "value", "ans"]) 16 self.target_df = self.target_df.sort_values('evaluate', ascending=False) 17 self.answer_val = list(self.target_df['ans']) # answer_val を評価値の高い順にソートされたものに変更 18 del self.target_df['ans'] # DataFrameにはもう必要ないので「ans」カラムを削除 19 20 self.target_ans = np.dot(np.array(answer_val), values) 21 self.index_list = self.target_df.index #indexの順番変更 22 23 def __judgeValue(self, fixed_list): # fixed_listで渡されたxの固定値における緩和問題を解き、分岐継続を判定する。また、よりよい解が見つかれば暫定解の交換を行う。 24 sum_weight = 0 # 採択したxのweightの合計値 25 evaluate_list = [] # 採択の判定を格納 26 evaluate_list.extend(fixed_list) 27 for index, val in enumerate(fixed_list): 28 sum_weight += self.target_df.ix[self.index_list[index]]['weight']*val # fixed_listで渡されたxの値でのweightの合計値 29 30 for index in range(len(fixed_list), len(self.index_list)): 31 if sum_weight > self.max_weight: #max_weightを超えた場合は分岐終了 32 return False # 分岐終了 33 elif sum_weight == self.max_weight: #max_weightに達しているので他のxは0 34 evaluate_list.append(0) 35 continue 36 else: 37 if sum_weight + self.target_df.ix[self.index_list[index]]['weight'] < self.max_weight: # x=1にしてもmax_weightに到達しないとき 38 sum_weight += self.target_df.ix[self.index_list[index]]['weight'] 39 evaluate_list.append(1) 40 else: # 0 < x <= 1 となるとき 41 evaluate_list.append((self.max_weight - sum_weight)/self.target_df.ix[self.index_list[index]]['weight']) 42 sum_weight = self.max_weight 43 if (self.max_weight - sum_weight) == self.target_df.ix[self.index_list[index]]['weight']: # x=1のとき、暫定解を入れ替える 44 evaluate_list_count = len(evaluate_list) 45 for i in range(evaluate_list_count, len(self.index_list)): # 決まっていないxは全部0を入れる 46 evaluate_list.append(0) 47 self.target_ans = np.dot(np.array(evaluate_list), np.array(self.target_df.value)) # 暫定解 target_ansの入れ替え  48 self.answer_val = evaluate_list # 暫定解 answer_valの入れ替え 49 return False # 分岐終了 50 51 if len(fixed_list) == len(self.index_list): # 全てのxの値が固定されているとき 暫定解との比較 52 if (sum_weight <= self.max_weight) and (np.dot(np.array(fixed_list), np.array(self.target_df.value)) > self.target_ans): # 暫定解との比較 53 self.target_ans = np.dot(np.array(fixed_list), np.array(self.target_df.value)) # 暫定解 target_ansの入れ替え  54 self.answer_val = fixed_list # 暫定解 answer_valの入れ替え 55 return False 56 57 if np.dot(np.array(evaluate_list), np.array(self.target_df.value)) > self.target_ans: # 緩和問題の解が暫定解を超えた時 58 return True # 分岐継続 59 else: # 暫定解を超えていないとき 60 return False # 分岐終了 61 62 def breadthFirstSearch(self): #幅優先探索 63 search_lists = [[0], [1]] # 要素 [0]、[1]は先に入れておく 64 while len(search_lists) != 0: # search_listsが空になるまで続ける 65 first_list = search_lists[0] # Queueで考える、上から1つ取得 66 search_lists.pop(0) # 取得した要素は削除 67 if self.__judgeValue(first_list): # 探索が継続かどうか 68 new_list_cp = copy.deepcopy(first_list) # 次要素に「1」を追加するために深いコピー 69 new_list_cp.append(0) # 0を末尾に追加 70 search_lists.append(new_list_cp) # 新たな要素を search_listsの末尾に格納 71 new_list_cp = copy.deepcopy(first_list) # 次要素に「0」を追加するために深いコピー 72 new_list_cp.append(1) # 1を末尾に追加 73 search_lists.append(new_list_cp) # 新たな要素を search_listsの末尾に格納 74 75 print("-----幅優先探索-----") 76 for index, val in enumerate(self.index_list): 77 print(val + ": " + str(self.answer_val[index])) 78 print("ans: " + str(self.target_ans)) 79 80 def depthFirstSearch(self): #深さ優先探索 81 search_lists = [[0], [1]] # 要素 [0]、[1]は先に入れておく 82 while len(search_lists) != 0: # search_listsが空になるまで続ける 83 first_list = search_lists[0] # Stachで考える、上から1つ取得 84 search_lists.pop(0) # 取得した要素は削除 85 if self.__judgeValue(first_list): # 探索が継続かどうか 86 new_list_cp = copy.deepcopy(first_list) # 次要素に「1」を追加するために深いコピー 87 new_list_cp.append(1) # 1を末尾に追加 88 search_lists.insert(0, new_list_cp) # 新たな要素を search_listsの先頭に格納 89 new_list_cp = copy.deepcopy(first_list) # 次要素に「0」を追加するために深いコピー 90 new_list_cp.append(0) # 0を末尾に追加 91 search_lists.insert(0, new_list_cp) # 新たな要素を search_listsの先頭に格納 92 93 print("-----深さ優先探索-----") 94 for index, val in enumerate(self.index_list): 95 print(val + ": " + str(self.answer_val[index])) 96 print("ans: " + str(self.target_ans)) 97 98# BranchAndBound(weight_list(a1, a2, a3, a4), value_list(c1, c2, c3, c4), max_weight(a_max), first_values(x1, x2, x3, x4)) 99# first_valuesは何でもよいが、ここではgreedy-algorithmで求めた解を初期値として与えた。 100 101bb = BranchAndBound([2, 3, 5, 6], [4, 5, 12, 14], 9, [1, 0, 0, 1] ) 102bb.breadthFirstSearch() 103bb = BranchAndBound([2, 3, 5, 6], [4, 5, 12, 14], 9, [1, 0, 0, 1] ) 104bb.depthFirstSearch()
-----幅優先探索----- x3: 0 x4: 1 x1: 0 x2: 1 ans: 19.0 -----深さ優先探索----- x3: 0 x4: 1 x1: 0 x2: 1 ans: 19.0

補足情報(FW/ツールのバージョンなど)

Python 3.6 anaconda使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

コードの本体は読んでいませんが、普通に転置して出力すれば良いのでは。結果がnumpy配列で出ることが前提です(list等ならnumpy配列に変換してください)。

python

1np.savetxt( 2 "sample.csv", 3 xxx.T, 4 "%0.0f", 5 delimiter=",", 6 header="x1 x2 x3 x4", 7 )

ところで、header="x1 x2 x3 x4"で良いんですか?(カンマ区切りでは)

投稿2018/11/19 09:22

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomokomomoko

2018/11/19 11:08

ご回答していただきありがとうございます. csvの出力の方ですが,ご指摘のとおりです.修正しようと思います. .Tで転置できることを把握しておりますが,list形式なのか,うまくいきません. どのようにnumpy形式に変換すればよいかが検討つかない状況です.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問