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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1959閲覧

【python】多次元行列の足し合わせがうまくできません

TheBullchannel

総合スコア33

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2019/08/04 15:59

前提・実現したいこと

多次元配列を足し合わせようとしていますが、うまくできません。
一旦csvで保存してから読み込んで足し合わせる処理をしましたが、うまくいきません
そもそもcsvに保存してからでなくてもできるように思えるのですが方法がわかりません。
教えてください。

発生している問題・エラーメッセージ

イメージ説明

図のようにまるで囲った 9x9の行列が 合計8個あります。
これらを足し合わせて1つの 9x9の行列にしたいです。

該当のソースコード

pythonで作成しております。
まず0で埋めた9x9の行列を作り、要素を埋めた後
一旦csvに保存する動作を8回分、for文で行った後、csvを読み込み足し合わせを試みたが
うまくいきません。

import numpy as np
import pandas as pd
import csv

'''CSVファイルの読み込み'''
list = pd.read_csv("list.csv", header=None)

'''CSVから読んだデータをnumpyの行列に入れる'''
list1 = np.array
list1 = list.values

print(list1)
for i in range((list1.shape[0])):

D = list1[int(i),1]*((list1[int(i),4])-(list1[int(i),6]))+list1[int(i),3]*((list1[int(i),6])-(list1[int(i),2]))+list1[int(i),5]*((list1[int(i),2])-(list1[int(i),4])) S = 0.5 * D f = 1 if i == 0: print(i+1) a1 = ((list1[int(i),3]*list1[int(i),6])-(list1[int(i),5]*list1[int(i),4]))/D a2 = ((list1[int(i),5]*list1[int(i),2])-(list1[int(i),1]*list1[int(i),6]))/D a3 = ((list1[int(i),1]*list1[int(i),4])-(list1[int(i),3]*list1[int(i),2]))/D b1 = ((list1[int(i),4])-(list1[int(i),6]))/D b2 = ((list1[int(i),6])-(list1[int(i),2]))/D b3 = ((list1[int(i),2])-(list1[int(i),4]))/D c1 = ((list1[int(i),5])-(list1[int(i),3]))/D c2 = ((list1[int(i),1])-(list1[int(i),5]))/D c3 = ((list1[int(i),3])-(list1[int(i),1]))/D A11 = S * ((b1 * b1) + (c1 * c1)) A12 = S * ((b1 * b2) + (c1 * c2)) A13 = S * ((b1 * b3) + (c1 * c3)) A21 = S * ((b2 * b1) + (c2 * c1)) A22 = S * ((b2 * b2) + (c2 * c2)) A23 = S * ((b2 * b3) + (c2 * c3)) A31 = S * ((b3 * b1) + (c3 * c1)) A32 = S * ((b3 * b2) + (c3 * c2)) A33 = S * ((b3 * b3) + (c3 * c3)) A = np.array([ [A11,A12,A13], [A21,A22,A23], [A31,A32,A33]]) j = list1[int(i),7] k = list1[int(i),8] l = list1[int(i),9] print(j,k,l) AX = np.zeros((9,9)) AX[int(j-1)][int(j-1)] = A11 AX[int(j-1)][int(k-1)] = A12 AX[int(j-1)][int(l-1)] = A13 AX[int(k-1)][int(j-1)] = A21 AX[int(k-1)][int(k-1)] = A22 AX[int(k-1)][int(l-1)] = A23 AX[int(l-1)][int(j-1)] = A31 AX[int(l-1)][int(k-1)] = A32 AX[int(l-1)][int(l-1)] = A33 with open('A.csv', 'w') as f: f.write(', '.join(map(str, AX)) + "\n") print(A) print(AX) elif i % 2 == 0: print(i+1) a1 = ((list1[int(i),3]*list1[int(i),6])-(list1[int(i),5]*list1[int(i),4]))/D a2 = ((list1[int(i),5]*list1[int(i),2])-(list1[int(i),1]*list1[int(i),6]))/D a3 = ((list1[int(i),1]*list1[int(i),4])-(list1[int(i),3]*list1[int(i),2]))/D b1 = ((list1[int(i),4])-(list1[int(i),6]))/D b2 = ((list1[int(i),6])-(list1[int(i),2]))/D b3 = ((list1[int(i),2])-(list1[int(i),4]))/D c1 = ((list1[int(i),5])-(list1[int(i),3]))/D c2 = ((list1[int(i),1])-(list1[int(i),5]))/D c3 = ((list1[int(i),3])-(list1[int(i),1]))/D A11 = S * ((b1 * b1) + (c1 * c1)) A12 = S * ((b1 * b2) + (c1 * c2)) A13 = S * ((b1 * b3) + (c1 * c3)) A21 = S * ((b2 * b1) + (c2 * c1)) A22 = S * ((b2 * b2) + (c2 * c2)) A23 = S * ((b2 * b3) + (c2 * c3)) A31 = S * ((b3 * b1) + (c3 * c1)) A32 = S * ((b3 * b2) + (c3 * c2)) A33 = S * ((b3 * b3) + (c3 * c3)) A = np.array([ [A11,A12,A13], [A21,A22,A23], [A31,A32,A33]]) j = list1[int(i),7] k = list1[int(i),8] l = list1[int(i),9] print(j,k,l) AX = np.zeros((9,9)) AX[int(j-1)][int(j-1)] = A11 AX[int(j-1)][int(l-1)] = A13 AX[int(j-1)][int(k-1)] = A12 AX[int(l-1)][int(j-1)] = A31 AX[int(l-1)][int(l-1)] = A33 AX[int(l-1)][int(k-1)] = A32 AX[int(k-1)][int(j-1)] = A21 AX[int(k-1)][int(l-1)] = A23 AX[int(k-1)][int(k-1)] = A22 with open('A.csv', 'a') as f: f.write(', '.join(map(str, AX)) + "\n") print(A) print(AX) else: print(i+1) a1 = ((list1[int(i),3]*list1[int(i),6])-(list1[int(i),5]*list1[int(i),4]))/D a2 = ((list1[int(i),5]*list1[int(i),2])-(list1[int(i),1]*list1[int(i),6]))/D a3 = ((list1[int(i),1]*list1[int(i),4])-(list1[int(i),3]*list1[int(i),2]))/D b1 = ((list1[int(i),4])-(list1[int(i),6]))/D b2 = ((list1[int(i),6])-(list1[int(i),2]))/D b3 = ((list1[int(i),2])-(list1[int(i),4]))/D c1 = ((list1[int(i),5])-(list1[int(i),3]))/D c2 = ((list1[int(i),1])-(list1[int(i),5]))/D c3 = ((list1[int(i),3])-(list1[int(i),1]))/D A11 = S * ((b1 * b1) + (c1 * c1)) A12 = S * ((b1 * b2) + (c1 * c2)) A13 = S * ((b1 * b3) + (c1 * c3)) A21 = S * ((b2 * b1) + (c2 * c1)) A22 = S * ((b2 * b2) + (c2 * c2)) A23 = S * ((b2 * b3) + (c2 * c3)) A31 = S * ((b3 * b1) + (c3 * c1)) A32 = S * ((b3 * b2) + (c3 * c2)) A33 = S * ((b3 * b3) + (c3 * c3)) A = np.array([ [A11,A12,A13], [A21,A22,A23], [A31,A32,A33]]) j = list1[int(i),7] k = list1[int(i),8] l = list1[int(i),9] print(j,k,l) AX = np.zeros((9,9)) AX[int(j-1)][int(j-1)] = A11 AX[int(j-1)][int(l-1)] = A13 AX[int(j-1)][int(k-1)] = A12 AX[int(l-1)][int(j-1)] = A31 AX[int(l-1)][int(l-1)] = A33 AX[int(l-1)][int(k-1)] = A32 AX[int(k-1)][int(j-1)] = A21 AX[int(k-1)][int(l-1)] = A23 AX[int(k-1)][int(k-1)] = A22 with open('A.csv', 'a') as f: f.write(', '.join(map(str, AX)) + "\n") print(A) print(AX)

'''CSVファイルの読み込み'''
ELEM = pd.read_csv("A.csv", header=None)

'''CSVから読んだデータをnumpyの行列に入れる'''
list2 = np.array
list2 = ELEM.values

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

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

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

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

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

0kcal

2019/08/04 16:17

お疲れ様です csvは関係ない気がします もう少し小さい規模で、わからない点を質問されたほうが、回答が得やすいと思います
TheBullchannel

2019/08/04 16:24

お疲れ様です わかりました。for文中で配列AXが出来上がりますが、これらを足し合わす方法を教えてください。 イメージ的に言えば配列AXに番号を振っていき、それらを足し合わす感じのものが作りたいです。 AX1+AX2+・・・ のようなイメージです。 for文中でAXを作ると、どんどん上書きされていき、最後のAXしか読み込めません。 そのためcsvに保存することにしました。
0kcal

2019/08/04 21:39

AX[int(j-1)][int(j-1)] += A11 一例ですが、上記のように、+=で加算すればいいと思います a = a + 3 みたいな書き方でも、同じ意味です
guest

回答1

0

ベストアンサー

質問文のコードは読めないので(編集してコードブロックでも使っていただくといいと思いますが、たぶんそれでも読めない)見ていませんが、同じshapeの複数の配列をnumpyで足し合わせたい、のであればnp.sumを使うだけですね。

python

1>>> import numpy as np 2>>> a, b, c = np.arange(12).reshape(3, 2, 2) 3>>> a 4array([[0, 1], 5 [2, 3]]) 6>>> b 7array([[4, 5], 8 [6, 7]]) 9>>> c 10array([[ 8, 9], 11 [10, 11]]) 12>>> np.sum([a, b, c], axis=0) 13array([[12, 15], 14 [18, 21]])

投稿2019/08/04 17:00

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問