🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
冗長化

冗長化とは、システムの一部に障害が発生してもサービスを継続できるようシステム構築を行うこと。要する量より多く予備装置を準備しバックアップとして配置しておきます。また、冗長化による安全性は、冗長性と呼ばれています。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

Q&A

解決済

2回答

1742閲覧

Python:for文の処理を簡略化したい

TeRa_130

総合スコア61

冗長化

冗長化とは、システムの一部に障害が発生してもサービスを継続できるようシステム構築を行うこと。要する量より多く予備装置を準備しバックアップとして配置しておきます。また、冗長化による安全性は、冗長性と呼ばれています。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

1グッド

4クリップ

投稿2020/03/16 07:46

前提・実現したいこと

Pythonを使用しています。

  • 実現したい内容 …

「 for文で処理しているのですが、コードが長くなってしまいます。できれば簡略化したいです。」

実行したコードとその結果

実行したコード

このようなコードを実行しました。

python

1In[]: 2df = pd.DataFrame({'x': np.array([0,1,1,2,2,1,0]), 3 'y': np.array([0,0,0,0,1,1,1]), 4 't': np.array([1,3,4,8,9,12,17])}) 5xy = np.zeros(0) 6t = np.zeros(0) 7 8for i in range(len(df)-1): 9 j = copy.deepcopy(i) 10 j += 1 11 12 t = np.append(t, df['t'][j] - df['t'][i]) 13 14 if df['x'][j]-df['x'][i]==1 and df['y'][j]-df['y'][i]==0: 15 xy = np.append(xy, 'r') 16 if df['x'][j]-df['x'][i]==-1 and df['y'][j]-df['y'][i]==0: 17 xy = np.append(xy, 'l') 18 if df['x'][j]-df['x'][i]==0 and df['y'][j]-df['y'][i]==1: 19 xy = np.append(xy, 'u') 20 if df['x'][j]-df['x'][i]==0 and df['y'][j]-df['y'][i]==-1: 21 xy = np.append(xy, 'd') 22 if df['x'][j]-df['x'][i]==0 and df['y'][j]-df['y'][i]==0: 23 xy = np.append(xy, 'o') 24 25df_new = pd.DataFrame({'xy': xy, 26 't' : t}) 27 28df_new
DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

y01-1
x
0oud
1r__
-1l__

↑こういう表を作ってindexから取得するのが速いです。

一次元のnp.ndarrayにおいて、前後の値の差を取得するにはnp.ediff1d()を使います。

python

1x = np.array([0, 1, 1, 2, 2, 1, 0]) 2y = np.array([0, 0, 0, 0, 1, 1, 1]) 3t = np.array([1, 3, 4, 8, 9, 12, 17]) 4mapping = np.array([['o', 'u', 'd'], 5 ['r', '_', '_'], 6 ['l', '_', '_']]) 7 8df_new = pd.DataFrame({'xy': mapping[np.ediff1d(x), np.ediff1d(y)], 9 't': np.ediff1d(t)}) 10print(df_new) 11# xy t 12# 0 r 2 13# 1 o 1 14# 2 r 4 15# 3 u 1 16# 4 l 3 17# 5 l 5

投稿2020/03/16 09:04

kirara0048

総合スコア1399

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

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

0

ベストアンサー

DataFrame上で処理するとしたらこんな感じになります。

Python

1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame({'x':[0, 1, 1, 2, 2, 1, 0], 5 'y':[0, 0, 0, 0, 1, 1, 1], 6 't':[1, 3, 4, 8, 9, 12, 17]}) 7conv = pd.Series(['r','l','u','d','o'], 8 index=[(1.,0.),(-1.,0.),(0.,1.),(0.,-1.),(0.,0.)]) 9 10df['xy'] = df[['x','y']].diff().apply(tuple, axis=1).map(conv) 11df['t2'] = df['t'].diff() 12print(df) 13# x y t xy t2 14#0 0 0 1 NaN NaN 15#1 1 0 3 r 2.0 16#2 1 0 4 o 1.0 17#3 2 0 8 r 4.0 18#4 2 1 9 u 1.0 19#5 1 1 12 l 3.0 20#6 0 1 17 l 5.0

投稿2020/03/17 01:11

magichan

総合スコア15898

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問