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

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

詳細はこちら
コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Python

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

Q&A

解決済

1回答

952閲覧

listの重みづけ和?

退会済みユーザー

退会済みユーザー

総合スコア0

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Python

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

0グッド

0クリップ

投稿2021/02/17 20:58

編集2021/02/18 03:07

1 0 0 0 1
0 0 0 0 1
0 1 1 1 0

こんな画像(値はRGBのいずれかの値)があったとして、
この値をlistに格納後、
一行ずつ、重みづけて和を取っていきたいのですが、方法が分かりません。
どう重みづけるかというと、具体的に、
左から右にいくにつれて0から1ずつ増えていく値を、listの各要素の値に掛け合わせた和を取りたいのですが(行が変わるとまた0に戻る)、

forを2つ使う必要があるのですが、printの中にforを入れる必要があると気づきました、しかしその方法が分かりません。

現時点では、

python

1for num in range(3): 2 print(num * img_pixels[190 * num] + (num + 1)) * img_pixels[190 * num + 1] + (num + 2)) * img_pixels[190 * num + 2])

ここまでが関の山ですが、これだと問題点が2つあり、
まず、
1.行が変わっても0に戻らない(ずっと掛け合わせる数が1ずつ増え続けてしまう)
2.各行について、左から3つの数の和しか取れていない(各行100個以上あるので、+?等と指定しているとかなり長くなってしまう、for numb等として別の数numbを用意し、num+numb等としてみたが、上手くいかない。

どうすれば良いでしょうか。

具体的には、

a = np.array([[1,0,0,0,1,・・・],
[0,0,0,0,1,・・・],
[0,1,1,1,0,・・・]
[・・・]])
に対して
[10+01+02+03+14+・・・,00+01+02+03+14+・・・,00+11+12+13+0*4+・・・,・・・]
を求めたい。
という事で、numpyのarrangeを使う方法を教えて頂きました。
numpyを使わずに入れ子for等を使ってする方法等もあるのでしょうか?

また、可能であれば掛け合わせる数字を規則的に変化させていく方法も知りたい(今は0から1ずつ増えているが、2ずつ増やしたり、指数分増やしたり、等)

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

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

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

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

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

meg_

2021/02/18 00:24

> 一行ずつ、重みづけて和を取っていきたいのですが、方法が分かりません。 例の行列に対して、欲しい結果を提示されると回答者に分かりやすいかと思います。
kaina

2021/02/18 03:20

naganumaさんは直近の質問が解決済みになっていないまま、幾つも質問をされています。 質問ないようから解決済みになっていない為、そのままにしているのでしょうが、 これらの質問の殆どに対して、マイナス評価が沢山付いていますよね? 何故マイナス評価が付くのか考えたことありますか? 回答や質問への追記・修正の中で様々な指摘事項に対して、向き合っていますか? 指摘事項を無視せず、質問の質を上げるようにして下さい。
1T2R3M4

2021/02/18 04:07

>数字を規則的に変化させていく方法も知りたい 自分で調べて、試してみてはいかがでしょうか。 コードをコピペするだけでなく、自分でプログラミングすることをおすすめします。
guest

回答1

0

ベストアンサー

質問が良くわかりませんが、以下と解釈して回答します。
縦横とかが違っていたら、適当に変えてください。

a = np.array([[1,0,0,0,1],
[0,0,0,0,1],
[0,1,1,1,0]])
に対して
[10+01+02+03+14,00+01+02+03+14,00+11+12+13+0*4]
を求めたい。

python

1>>> import numpy as np 2>>> a = np.array([[1,0,0,0,1], 3... [0,0,0,0,1], 4... [0,1,1,1,0]]) 5>>> 6>>> print(a) 7[[1 0 0 0 1] 8 [0 0 0 0 1] 9 [0 1 1 1 0]] 10>>> w = np.arange(a.shape[1]) 11>>> print(w) 12[0 1 2 3 4] 13>>> print(np.dot(a, w)) 14[4 4 6]

forで回したいなら

python

1>>> import numpy as np 2>>> def compute(d2array, warray): 3... result = np.zeros(d2array.shape[0], dtype=a.dtype) 4... for i in range(d2array.shape[0]): 5... for j in range(d2array.shape[1]): 6... result[i] = result[i] + d2array[i, j] * warray[j] 7... return result 8... 9>>> a = np.array([[1,0,0,0,1], 10... [0,0,0,0,1], 11... [0,1,1,1,0]]) 12>>> w = np.array([0, 1, 2, 3, 4]) 13>>> print(compute(a,w)) 14[4 4 6]

重みを他のものに変えたいときは、wを好きなように変更していください。

numpyの機能を一切使わないなら、以下ですね。

python

1>>> def compute_l(alist_of_lists, aweight): 2... result = [] 3... for alist in alist_of_lists: 4... asum = 0 5... for j in range(len(aweight)): 6... asum = asum + alist[j] * aweight[j] 7... result.append(asum) 8... return result 9... 10>>> list_of_lists = [[1,0,0,0,1], [0,0,0,0,1], [0,1,1,1,0]] 11>>> weight = [0, 1, 2, 3, 4] 12>>> print(compute_l(list_of_lists, weight)) 13[4, 4, 6]

投稿2021/02/17 22:28

編集2021/02/18 03:51
ppaul

総合スコア24670

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

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

退会済みユーザー

退会済みユーザー

2021/02/18 06:10 編集

ありがとうございます。 >>V[1*0+0*1+0*2+0*3+1*4,0*0+0*1+0*2+0*3+1*4,0*0+1*1+1*2+1*3+0*4] はい、値をどこに格納するか書いておりませんでしたが、行列に格納するとそうです。 自分は白黒画像についているので、RGBが3種類必要ありませんでした(0or255) これ、numpy使うとそんな簡単に求まるのですか? for入れ子構造とかでは無理なんでしょうか? おお、これは素晴らしい、、行列の積を使用してるんですかね。 numpyだとこんな簡単にできるんですね。 行列計算で処理すると面白いですね、行列に詳しいと、様々な操作が意外と簡単にできる・・・! これを使うためには、そもそも画像をnumpy型、つまり行列型として取得する必要がありそうですね。 あとこれ、行によって重みを変えたい場合はどうするんでしょうか? w = np.array([0, 1, 2, 3, 4]) で全行に0.1.2.3.4を掛けるのだから、 w = np.array([1,0,0,0,1,・・・], [0,0,0,0,1,・・・], [0,1,1,1,0,・・・] [・・・]]) で全行それぞれ、掛ける値が設定できる・・・? というわけではないんですかね?
退会済みユーザー

退会済みユーザー

2021/02/18 07:46 編集

なるほど、、後でやってみようと思います。 ところで、更に発展的ですが、 ある成分の左右、上下にある値を足し合わせたり掛け合わせたりする処理を行いたい場合、便利な方法等ありますかね? 掛け合わせてる行列の、一部成分が数字でなく文字(配列成分)に、いちいち指定したオリジナル配列を掛けるぐらいしかないですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問