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

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

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

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

Python

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

Q&A

解決済

1回答

1094閲覧

if文を含む自作関数をndarrayに一括適用したい

yuru-camper

総合スコア18

NumPy

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

Python

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

0グッド

0クリップ

投稿2019/04/05 03:17

したいこと
if文を含む以下の関数をndarrayにfor文を使わずに適用したいです。

python

1def to3dim(x): 2 zeros = np.zeros_like(x) 3 if x[0] - x[-1] <= 0: 4 y = np.dstack((x, zeros)).transpose((2, 0, 1)) 5 else: 6 y = np.dstack((zeros, x)).transpose((2, 0, 1)) 7 return y

適用したいndarrayの形状は(n, 4)です。それを(2, n, 4)としたいです。

[[0, 1, 2, 3], [7, 6, 5, 4]] を [[[0, 1, 2, 3], [0, 0, 0, 0]], [[0, 0, 0, 0], [7, 6, 5, 4]]] のようにする。

frompyfuncやvectorizeをただ適用しただけではエラーが出てしまいました。
どうすればよいでしょうか。お力添えお願いします。

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

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

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

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

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

tiitoi

2019/04/05 03:27 編集

> x[0] - x[-1] <= 0 は、(1行目 - n行目) のベクトルの"すべて"の値が0以下という意図でしょうか?
yuru-camper

2019/04/05 03:45

いえ、各行の要素のつもりです。 もしかしてこれだと行単位で考えていますか?
tiitoi

2019/04/05 04:13

print(x[0] - x[-1] <= 0) # [ True True True True] となります。 [[0, 1, 2, 3], [7, 6, 5, 4]] からどのような規則で以下の出力が導出されたのかが質問のコードからは推察できないため、回答できません。 [[[0, 1, 2, 3], [0, 0, 0, 0]], [[0, 0, 0, 0], [7, 6, 5, 4]]]
tiitoi

2019/04/05 04:14

文章で入力から出力が作られる過程を書いてください。 それがわかれば、numpy でのコードを提示できます。
yuru-camper

2019/04/05 05:08

x[0] と x[-1] のどちらが大きいかでdstackの引数の順番が変わる、というコードです。 例えばx = [0, 1, 2, 3] は x[0] < x[-1] なのでnp.dstack((x, zeros))、 x = [7, 6, 5, 4] は x[0] < x[-1] なのでnp.dstack((zeros, x))、という感じです。
guest

回答1

0

ベストアンサー

  1. x が (N, M) の配列だとすると、(2 * N, M) という結果を格納する配列を用意しておく。

  2. x[:, 0] <= x[:, -1] を満たす行は0が下、そうでない行は0が上にくる。bool を int にキャストすると、True は1、False は0になることを利用して、0を入れる行を特定する。

python

1import numpy as np 2 3x = np.array([[0, 1, 2, 3], 4 [7, 6, 5, 4]]) 5 6def process(x): 7 # x が (N, M) の配列だとすると、(2 * N, M) という結果を格納する配列を用意しておく。 8 rows, cols = x.shape 9 ret = np.empty((rows * 2, cols), dtype=x.dtype) 10 11 pos = np.arange(0, len(ret), 2) 12 condition = x[:, 0] <= x[:, -1] 13 print('pos', pos) # [0 2] 14 print('condition', condition) # [ True False] 15 16 # condition を満たす行は0が下、そうでない行は0が上にくる。 17 zero_rows = pos + condition.astype(int) # zero の行 18 not_zero_rows = pos + (~condition).astype(int) # zero でない行 19 20 ret[zero_rows] = 0 21 ret[not_zero_rows] = x 22 23 return ret 24 25print(process(x)) 26# [[0 1 2 3] 27# [0 0 0 0] 28# [0 0 0 0] 29# [7 6 5 4]]

投稿2019/04/05 05:44

tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問