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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

231閲覧

python 列とリストの計算

shougi

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/11/20 00:05

編集2018/11/20 06:34

やりたいことは,リストと複数の配列を計算して,計算結果の配列を空の配列に追加していきたいです.

python

1import pandas as pd 2import numpy as np 3 4# データ読み込み 5Ds1 = pd.read_excel('sample.xlsx', '--') 6Ds2 = pd.read_excel('sample.xlsx', '-') 7# データ名(実際はすでにエクセルに下記のデータ名が入力されている) 8L5 = ['W-A0', 'W-B0', 'W-F0', 'W-C1', 'W-E1', 'W-A2', 'W-B2', 'W-D2', 'W-F2', 'W-C3', 'W-E3', 9 'W-A4', 'W-B4', 'W-F4'] 10 11# リスト 12dL = list(range(100, 2100, 200)) 13B = np.zeros((0, Ds1.values.shape[0])) 14 15# 計算 16for i in range(0,2): 17 A1 = dL[i] + Ds2.loc[:, Ds2.columns.str.contains(r'(?=.*W)(?=.*%s)' % i)].values + Ds1.loc[:, Ds1.columns.str.contains(r'(?=.*W)(?=.*%s)' % i)].values 18 B = np.r_[B, A1.reshape(1, -1)] 19B.T

Ds1,2ともにshapeは(164,14)の数値列,数値はランダムです.
また両方ともcolumnsは上記コード内のリストL5です.

発生エラー

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-28-2163de09022c> in <module>() 16 for i in range(0,2): 17 A1 = dL[i] + Ds2.loc[:, Ds2.columns.str.contains(r'(?=.*W)(?=.*%s)' % i)].values + Ds1.loc[:, Ds1.columns.str.contains(r'(?=.*W)(?=.*%s)' % i)].values ---> 18 B = np.r_[B, A1.reshape(1, -1)] 19 B.T C:\lib\site-packages\numpy\lib\index_tricks.py in __getitem__(self, key) 336 objs[k] = objs[k].astype(final_dtype) 337 --> 338 res = _nx.concatenate(tuple(objs), axis=self.axis) 339 return self._retval(res) 340 ValueError: all the input array dimensions except for the concatenation axis must match exactly

for文のA1までは動くのですが,Bのところでエラーが発生します.改善できないでしょうか.

以下のコードではうまくいくのですが,上記ではなぜできないのか原因がわかりません.

python

1import pandas as pd 2import numpy as np 3 4# データ 5Ds1 = pd.DataFrame(np.random.randn(10, 2), columns=['L-0','L-1']) 6Ds2 = pd.DataFrame(np.arange(30).reshape(10, 3), columns=['L-0','L-1','L-2']) 7 8dL = list(range(100, 2100, 200)) 9dL1 = [100, 300, 450, 600, 750, 900] 10B = np.zeros((0, Ds1.values.shape[0])) 11 12# 計算 13for i in range(0,2): 14 A1 = dL[i] + Ds2.loc[:, Ds2.columns.str.contains(r'(?=.*%s)' % i)].values + Ds1.loc[:, Ds1.columns.str.contains(r'(?=.*%s)' % i)].values 15 B = np.r_[B, A1.reshape(1, -1)] 16 17B.T

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

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

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

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

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

can110

2018/11/20 00:28

提示ソースには「np.arange(30).reshape(10, 2)」など明らかな誤りがあります。また質問文も抽象的で具体的にどうしたいのかが不明です。整理し明確にしないと回答得るのは厳しいと思います。
shougi

2018/11/20 01:36

失礼いたしました.ご指摘いただきありがとうございます.コード等修正しました.
can110

2018/11/20 02:02

追記ありがとうございます。最初のソースにおいて①発生エラー全文(Traceback)②Ds1,Ds2の行列数や具体的なデータ内容(他人がコード実行できて再現できるもの)を追記ください。
shougi

2018/11/20 02:28

何度も申し訳ありません.修正しました.
can110

2018/11/20 07:29 編集

「~.columns.str.contains(r'(?=.*W)(?=.*%s)')」の意図するところ、どんな列を抽出したいかを説明ください
shougi

2018/11/20 07:17

上記コードでは,L5リストのデータ名においてWとfor文のiに入力される数が含まれるデータ名の列を抽出したいです.
can110

2018/11/20 07:32

返答ありがとうございます。前回の質問、誤りがありましたので修正しました。失礼しました。で、抽出したい列名ですが、i=0で['W-A0', 'W-B0', 'W-F0']の3列、i=1で['W-C1', 'W-E1']の2列というのは意図した動作になっていますでしょうか?
shougi

2018/11/20 07:45

説明不足で申し訳ありません.はい,そのような動作を考えています.列数がバラバラでも計算できればと
guest

回答1

0

ベストアンサー

列数の異なるarrayを行方向に足し合わせたいということでしょうか。
そのままでは無理なのでnumpy.resizeで足りない方の列を0埋めで増やしてやるしかないと思います。
参考:Python: Resize an existing array and fill with zeros

なお、2点ほど疑問点をコメント中に記載しましたので回答願います。

Python

1import pandas as pd 2import numpy as np 3 4dat = np.arange(164*14).reshape(164,-1) 5L5 = ['W-A0', 'W-B0', 'W-F0', 'W-C1', 'W-E1', 'W-A2', 'W-B2', 'W-D2', 'W-F2', 'W-C3', 'W-E3', 6 'W-A4', 'W-B4', 'W-F4'] 7 8Ds1 = pd.DataFrame(dat,columns=L5) 9Ds2 = pd.DataFrame(dat,columns=L5) 10print(Ds1.shape,Ds2.shape) # 質問文よりどちらも(164, 14) (164, 14) 11 12dL = list(range(100, 2100, 200)) 13#B = np.zeros((0, Ds1.values.shape[0])) # 不要 14 15for i in range(0,2): 16 col1 = Ds1.columns.str.contains(r'(?=.*W)(?=.*%s)' % i) 17 col2 = Ds2.columns.str.contains(r'(?=.*W)(?=.*%s)' % i) 18 A1 = dL[i] + Ds2.loc[:, col2].values + Ds1.loc[:, col1].values 19 20 # copy()が必要 21 # Numpy, the array doesn't have its own data? 22 # https://stackoverflow.com/questions/23253144/numpy-the-array-doesnt-have-its-own-data 23 A1 = A1.reshape(1, -1).copy() 24 print(A1.shape) # ①i=0で(1, 492)、i=1で(1, 328)だが正しいか? 25 26 if i == 0: 27 B = A1.copy() 28 else: # 列数を大きい方に合わせる 29 if B.shape[1] < A1.shape[1]: 30 B.resize((B.shape[0],A1.shape[1])) 31 elif A1.shape[1] < B.shape[1]: 32 A1.resize((1,B.shape[1])) 33 B = np.r_[B, A1] 34 35print((B.T).shape) # ②(492, 2)だが正解は?

結局は

かなり推測(エスパー)入っていますが、以下が求めるコードになるかと思われます。

Python

1import pandas as pd 2import numpy as np 3 4dat = np.arange(164*14).reshape(164,-1) 5L5 = ['W-A0', 'W-B0', 'W-F0', 'W-C1', 'W-E1', 'W-A2', 'W-B2', 'W-D2', 'W-F2', 'W-C3', 'W-E3', 6 'W-A4', 'W-B4', 'W-F4'] 7 8Ds1 = pd.DataFrame(dat,columns=L5) 9Ds2 = pd.DataFrame(dat,columns=L5) 10print(Ds1.shape,Ds2.shape) # 質問文よりどちらも(164, 14) (164, 14) 11 12dL = list(range(100, 2100, 200)) # [100,300,500,...] 13#B = np.zeros((0, Ds1.values.shape[0])) # 不要 14 15for i in range(0,2): 16 # Df1とDf2の'W=??'列 同士(+dL)を足し合わせる shape(164,xx) xx=3,2 17 col1 = Ds1.columns.str.contains(r'(?=.*W)(?=.*%s)' % i) 18 col2 = Ds2.columns.str.contains(r'(?=.*W)(?=.*%s)' % i) 19 A1 = dL[i] + Ds2.loc[:, col2].values + Ds1.loc[:, col1].values 20 21 if i == 0: 22 B = A1.copy() 23 else: 24 B = np.c_[B, A1] # 列方向に足す! 25 26print(B.shape) # 欲しいshapeは(164, 5)

投稿2018/11/20 09:06

編集2018/11/20 11:27
can110

総合スコア38266

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

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

shougi

2018/11/20 10:16

ご返答いただきありがとうございます.ただ,やっていただいて申し訳ないのですが,私の方で説明不足のようで質問に語弊がありました.申し訳ありません. やりたいことは,for文を使用してA1を計算した配列を一つの配列にまとめたいのです.私の上記コードではshapeが(164, 5)にしたいのです.例えば,私の下記コードが一例なのですが,i=0のときのA1の配列とi=1のときのA1配列を結合したいのです. これでうまく説明できているかわかりませんが,よろしくお願いいたします.
can110

2018/11/20 10:38

すみません。ほぼ分かりません。 こちらが根本的な勘違いをしているのかもしれませんが。 回答コード内の2点と以下1点について回答願います。 ① >私の上記コードではshapeが(164, 5)にしたいのです. 2回ループしているのになぜ(~,5)になるのでしょうか?
shougi

2018/11/20 10:55

コード中①について i=0のときデータ名に'W'と'0'を含む列(3列)同士の和算なのでshapeが(164,3) i=1のときデータ名に'W'と'1'を含む列(2列)同士の和算なのでshapeが(164,2) コード中②について 上記のi=0のときとi=1のときの配列を結合して(164,5) コメント①について for文をなくして,繰り返さず,単純にA1のiに0を入力した計算結果は(164,3)の配列 iに1を入力した場合は(164,2)の配列が得られます. この二つの配列を単純に結合すると(164,5) 以上,よろしくお願いいたします.
can110

2018/11/20 11:10

コメントありがとうございます。 まず、コード中①について >i=0のときデータ名に'W'と'0'を含む列(3列)同士の和算なのでshapeが>(164,3) ここでの列「同士」の加算とありますが、加算X+YにおけるXとYはどれに当たりますか?X=A1.reshape(1,-1)、Y=Bでしょうか? である場合、Bのshapeは[(空)]なので足しようがないと思うのですが? また、A1.reshape(1,-1)=(1,164*3)なので、その結果のshapeは(164,3)にはならないですが、なぜでしょうか? コード中②についても同様、shapeが合いませんが、なぜでしょうか? コメント①については reshape(1,-1)している意図はなんでしょうか? まとめると、説明されているshapeとコード中のshapgeが合っていませんが、どちらが正解でしょうか?という点が分かりません。
shougi

2018/11/20 11:30

すみません.ネットから拾ってきて代用していたので,私がA1.reshape(1, -1)を誤解していたようです.いわれて気づきました. 私の説明しているのが正しいshapeになります. 1つ目の加算はA1中の計算式内の加算です.要はDs1の配列とDs2の配列です. 大変申し訳ありません.
shougi

2018/11/20 11:33

回答で間違いないです.私の認識不足で大変お手数をおかけしました.また,長いお時間お付き合いいただき,ありがとうございました. 大変勉強になりました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問