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

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

ただいまの
回答率

87.61%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 644

score 18

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

def to3dim(x):
    zeros = np.zeros_like(x)
    if x[0] - x[-1] <= 0:
        y = np.dstack((x, zeros)).transpose((2, 0, 1))
    else:
        y = np.dstack((zeros, x)).transpose((2, 0, 1))
    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をただ適用しただけではエラーが出てしまいました。
どうすればよいでしょうか。お力添えお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tiitoi

    2019/04/05 13: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 13:14

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

    キャンセル

  • yuru-camper

    2019/04/05 14: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))、という感じです。

    キャンセル

回答 1

checkベストアンサー

0

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

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

import numpy as np

x = np.array([[0, 1, 2, 3],
              [7, 6, 5, 4]])

def process(x):
    # x が (N, M) の配列だとすると、(2 * N, M) という結果を格納する配列を用意しておく。
    rows, cols = x.shape
    ret = np.empty((rows * 2, cols), dtype=x.dtype)

    pos = np.arange(0, len(ret), 2)
    condition = x[:, 0] <= x[:, -1]
    print('pos', pos)  # [0 2]
    print('condition', condition)  # [ True False]

    # condition を満たす行は0が下、そうでない行は0が上にくる。
    zero_rows = pos + condition.astype(int)  # zero の行
    not_zero_rows = pos + (~condition).astype(int)  # zero でない行

    ret[zero_rows] = 0
    ret[not_zero_rows] = x

    return ret

print(process(x))
# [[0 1 2 3]
#  [0 0 0 0]
#  [0 0 0 0]
#  [7 6 5 4]]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る