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

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

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

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

Python

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

Q&A

解決済

2回答

1360閲覧

python3の演算等につきまして

sannbiki

総合スコア1

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/06/26 13:18

前提・実現したいこと

緯度・経度(10進表記)を60進表記に変換する方法を模索しております。
10進表記のデータを60進表記(の少し特殊な表記)にするた__めに度分秒のデータに分けることはできます。
しかしながら、例えば60秒を1分に繰り上げる処理に苦難してお__ります。
実現したいのは以下のような処理です。

numpy.adarrayとして以下があったとして、
s = [23 24 60 50 60 52] #秒のデータ
m = [40 35 32 20 59 21] #分のデータ
d = [12 13 12 11 20 22] #度のデータ
#s,m,dは必ず同じデータ数とする。ワープし過ぎというツッコミはなしで。。

①sに60があった場合、0に置換して、mの同位置を+1し、sおよびmを更新する。
上記の例ではs[2],s[5]だけを0に置換し、m[2]およびm[5]を+1する。
よって、
s = [23 24 0 50 0 52]
m = [40 35 33 20 60 22]
d = [12 13 12 11 20 22]
が得られる。

②mに60があった場合、0に置換して、dの同位置を+1し、mおよびdを更新する。
よって、
s = [23 24 0 50 0 52]
m = [40 35 33 20 0 22]
d = [12 13 12 11 21 22]
が得られる。

③最後に、d * 10000 + m * 100 + sの演算結果を返す。

試したこと

①について、"np.where(s == 60)[0]"でsに60が含まれるか否か、含まれるとしたらどの位置かを特定することはできました。また、sに含まれる60を"np.where(s == 60, 0, s)"で0に置換できました。しかし、sの60が含まれた位置と同位置のmの値に+1をして、mを更新する方法がわかりませんでした。ここが分かれば、②は同様の処理と思われますが、これを実現するにはどのような処理が考えられますでしょうか。
上記の例は当方が適当に設定したものですが、実際に取り扱うのは10000データ程度はあります。
お力添えを頂きたく。よろしくお願い申し上げます。

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

使用言語はPython3.7.9です。
Python3に触れて1週間程度です。

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

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

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

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

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

guest

回答2

0

さすがnumpy、inplace処理がエレガントに書けるようで。私はピュアPythonで。

python

1s = [23, 24, 60, 50, 60, 52] 2m = [40, 35, 32, 20, 59, 21] 3d = [12, 13, 12, 11, 20, 22] 4 5 6def fn(dn, mn, sn): 7 mn, sn = mn + sn // 60, sn % 60 8 dn, mn = dn + mn // 60, mn % 60 9 return dn, mn, sn 10 11 12d, m, s = zip(*map(fn, d, m, s)) 13print(s, m, d, sep='\n')

投稿2021/06/26 14:04

編集2021/06/26 14:13
YouheiSakurai

総合スコア6142

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

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

sannbiki

2021/06/26 14:52

ご回答ありがとうございました。欲しい答えが60進法表記であることに基づいた演算方法と推察申し上げます。本手法も必ず活用できる場面があると存じますので、参考にさせていただきます。
guest

0

ベストアンサー

こういうことがしたいのでしょうか?
(21と22が違うのはご質問の打ち間違いだと思います)

python

1>>> s = np.array([23, 24, 60, 50, 60, 52]) 2>>> m = np.array([40, 35, 32, 20, 59, 21]) 3>>> d = np.array([12, 13, 12, 11, 20, 22]) 4>>> 5>>> m = np.where(s != 60, m, m+1) 6>>> s = np.where(s != 60, s , 0) 7>>> d = np.where(m != 60, d, d+1) 8>>> m = np.where(m != 60, m, 0) 9>>> 10>>> print(s) 11[23 24 0 50 0 52] 12>>> print(m) 13[40 35 33 20 0 21] 14>>> print(d) 15[12 13 12 11 21 22]

投稿2021/06/26 13:48

ppaul

総合スコア24670

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

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

sannbiki

2021/06/26 14:37

早々にご回答いただきまして、誠にありがとうございました。期待通りの出力が得られました。 ご指摘の通り、21と22は当方のタイプミスによるものです。さらに言えば、mの初期値に60が含まれる場合の考慮を質問の中で提示できておらず、ミスばかりでお恥ずかしいばかりです。 この場合、頂いたご回答の最初にd = の処理を書いておけばいいのかと思いましたが、間違い、不足がありましたらご指摘頂けますと幸いに存じます。 左辺を既出の値にしてしまうだけで上書きできるものなのですね。重ねてお恥ずかしいのですが、初心者にとっては目から鱗でございました。
ppaul

2021/06/26 14:49

mの初期値に60が含まれる場合 は >>> s = np.array([23, 24, 60, 50, 60, 52]) >>> m = np.array([40, 35, 32, 20, 60, 21]) >>> d = np.array([12, 13, 12, 11, 20, 22]) >>> >>> m = np.where(s < 60, m, m+1) >>> s = np.where(s < 60, s , s-60) >>> d = np.where(m < 60, d, d+1) >>> m = np.where(m < 60, m, m-60) >>> >>> print(s) [23 24 0 50 0 52] >>> print(m) [40 35 33 20 1 21] >>> print(d) [12 13 12 11 21 22] でできると思います。
sannbiki

2021/06/26 15:05

重ねてありがとうございました。60が61になるのを未然に防ぐための処理ですね。真、勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問