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

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

詳細はこちら
for

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

配列

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

Q&A

解決済

2回答

1186閲覧

pythonで,配列内で重複する値のインデックス値とそれに対応する別の配列の値を取得したい.

masaosa

総合スコア18

for

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

配列

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

0グッド

0クリップ

投稿2021/03/29 09:27

私は今,画像処理の勉強をしています.
その際for文を使わないでコードを書いています.
以下のような処理の方法が分からず,調べてもあまり検索にヒットしませんでした.

[処理したい内容]
2つの配列が,あります.
一つは画像の座標を格納している座標(zahyou).
もう一つがzahyou配列のインデックス値に対応する画素値を格納している配列(value)です.
このとき,zahyou配列には座標2と8が重複しており,それぞれに対応している画素値が20,200 と80,800とします.
重複している座標番号には,各画素値の加算した値を入れたいのですが,新しい配列に代入すると大きい値の方が入ってしまいます.
一番下段のほしい計算結果となるようにはいい方法がありますでしょうか?
その際for文を使わずに書けますでしょうか?
何卒よろしくお願いいたします.

python

1import numpy as np 2 3zahyou=[0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 8 , 10] 4value= [0,10,20,200,30,40,50,60,70,80,800,100] 5 6zahyou=np.array(zahyou) 7value=np.array(value) 8print(value) 9 10new_value=np.zeros(len(zahyou)) 11new_value[zahyou]=new_value 12 13print(new_value) 14#計算結果 15#[ 0. 10. 200. 30. 40. 50. 60. 70. 800. 0. 100. 0.] 16# 17#ほしい計算結果 18#[ 0. 10. 220. 30. 40. 50. 60. 70. 880. 0. 100. 0.]

追記
下記のように書けば画素値の加算は取得できるのですが,複数の座標を指定するとエラーになってしまいできません.
また取得したsum_valueをどのように対応する座標に戻せばよいかわかりません.

python

1#zahyou=[0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 8 , 10] 2#value= [0,10,20,200,30,40,50,60,70,80,800,100] 3num=8 4num=np.array(num) 5indexes = [i for i, x in enumerate(zahyou) if x == ran] 6print(indexes) 7# [9,10] 8sum_value=np.sum(value[indexes]) 9print(sum_value) 10#880 11

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

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

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

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

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

meg_

2021/03/29 11:08

> その際for文を使わないでコードを書いています. > その際for文を使わずに書けますでしょうか? "for文"を使用してはいけない理由は何でしょうか?
masaosa

2021/03/29 11:44

pythonだと、for文が遅く、最小二乗法など、何度も繰り返し計算する必要のある画像処理をしたいので、for文を使わない処理をしたいです、、、、
meg_

2021/03/29 11:59

同じ座標に異なる値が存在している状況がよく分かりません。画像処理であれば多次元配列ではないんでしょうか?
masaosa

2021/03/29 12:15

説明不足ですいません。 私がやりたいのは、CTなどの医用画像処理でありまして、ある二次元配列に対して、360度の角度から1度ずつ投影(配列の積分)する場合などについてでして、その場合行列などを使用して計算していくと、同じ座標に対して別々の値を持った配列ができ、それらを加算すると、目的とする値が算出されます。
meg_

2021/03/29 12:52

単純に2次元配列同士の足し算等では実現不可能な計算なのでしょうか? 質問の配列(リスト)の状態では計算しづらい形式だと思います。
guest

回答2

0

ベストアンサー

こちらの回答が使えそうです。
numpy.ufunc.at (今回は numpy.add.at) を使います。

python

1import numpy as np 2 3zahyou=[0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 8 , 10] 4value= [0,10,20,200,30,40,50,60,70,80,800,100] 5 6zahyou=np.array(zahyou) 7value=np.array(value) 8 9new_value = np.zeros(len(zahyou)) 10np.add.at(new_value, zahyou, value) 11 12print(new_value) 13#[ 0. 10. 220. 30. 40. 50. 60. 70. 880. 0. 100. 0.]

投稿2021/03/30 02:48

編集2021/03/30 02:50
bsdfan

総合スコア4794

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

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

masaosa

2021/03/30 04:10

ありがとうございます!とても早くなりました.!
guest

0

内包表記をfor文でないと考えるなら以下で出来ます。

python

1>>> zahyou=[0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 8 , 10] 2>>> value= [0,10,20,200,30,40,50,60,70,80,800,100] 3>>> zahyou=np.array(zahyou) 4>>> value=np.array(value) 5>>> sum_value = value @ np.array([zahyou==i for i in range(len(zahyou))]).astype(np.int32).T 6>>> print(sum_value) 7[ 0 10 220 30 40 50 60 70 880 0 100 0]

投稿2021/03/29 14:11

ppaul

総合スコア24670

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

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

masaosa

2021/03/30 04:10

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問