プロが教える店舗&オフィスのセキュリティ対策術

import numpy as np

min = np.array([10,10,10])
a = np.array([3,5,11])
でaとminの各行ベクトルの対応する要素の大小関係を調べてminの要素が最小値と
なる(min = [3,5,10])
となるようにしたいのですが、これをnumpyのpythonで書いた場合、
どういった書き方が一番ベターなのでしょうか?

質問者からの補足コメント

  • TypeError: 'numpy.ndarray' object is not callable
    のエラーが出ます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/01/25 19:34
  • min -> m
    にしても同じエラーが出るようなのですが?

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/01/25 22:32
  • ごめんなさい!!
    pythonのインターラクティブシェルを立ち上げ直したらうまくいきました。
    pythonは3系を使っています。

    mask = (a < m)
    m[mask] = a[mask]

    でも動くようですが、maskの情報をif()文に取り込んで、書くようなことってできないのでしょうか?

    No.4の回答に寄せられた補足コメントです。 補足日時:2017/01/26 06:07

A 回答 (5件)

> maskの情報をif()文に取り込んで、書くようなこと



うーん、こういう風にしたいんですかね?

>>> m = np.array([10, 10, 10])
>>> a = np.array([3, 5, 11])
>>> mask = (a < m)
>>> i = 0
>>> for test in mask:
   if test:
    m[i] = a[i]
    i += 1


>>> m
array([ 3, 5, 10])
>>>

これは結局、

>>> mask = (a < m)
>>> mask
array([ True, True, False], dtype=bool)

とmaskはTrue、Falseで構成されたarrayになって、またnumpyが提供するarrayがiterableだから、ですよね(for文を使って情報を取り出す事が出来る)。
まあこうやって出来なくはないんですが・・・・・・。
ただまあ、冗長ですよね。

個人的にはやっぱり #1 でやったやり方がPythonらしいと思います。
ポイントは2つ。

1. 題意ではデータが、m、a、と2つ与えられていて、mを「書き換える」主旨になっているが、可能ならば、与えられたデータは直接変更しない方が現代的である。

これはここで紹介した改造版でもそうなんですが、元々mを「書き換える」前提になっています。破壊的変更、って呼ぶんですが。
ただ、現代的な感覚だと、mを「書き換える」のではなくって、新しく「解を生成して」返した方がより良いですね。
何故かと言うと、プログラミングしたプログラムが大きくなるにつれ、データの「破壊的変更」をガンガンやっていくと、どこでデータが「変更」されたか分からなくなってバグの温床になる可能性が高いから、です。
PythonはC言語等と違い、ガベージコレクタを持ってるんで、「使われなくなったデータ」はゴミとして回収されてメモリを圧迫するような構造にはなってないんで、Pythonを使う以上、ガベージコレクションをアテにした「現代的な」プログラミングをまずしてみるのが吉、だと言う事です。

2. Pythonの内包表記は速い。

Python3にはリスト内包表記を始めとしていくつか内包表記が提供されています。
#1 のコードも内包表記で書いてますが、フツーにfor文で回すより速い、つまり最適化が成されています。
これは、以前にも別のトコで書いてますが、要するにPythonの開発者達が

「内包表記を使ってくれ」

と言ってる、メッセージですね。
扱うデータがリスト等のコレクションである、なおかつfor文やif文を使わないといけない、ってなった場合、まず最初に使おう、って考えるのはPythonだと「内包表記」です。
内包表記で上手く行きそうにない場合、初めてfor文等を登場させる、ってのがむしろ一番Python臭い解決法ですね。
    • good
    • 0
この回答へのお礼

詳しい説明、ありがとうございました。

お礼日時:2017/01/30 10:19

うーん、ちゃうなぁ、Python 3.5.2で試してみたけど「キチンと動き」ますね。


ハテ、そっちで何が一体起こってんだろうか?
この回答への補足あり
    • good
    • 0

さぁ、そうなると分からんですね。


こっちだと「上手く動いてる」としかいいようないです。

ちなみにこっちの環境だとPython 2.7.12、OSはLinuxですが、Python3.x系を使ってるんですかね?
(毎回言ってますが、Pythonの質問を投げる場合、2.x系なのか3.x系なのか付加しないと、ちょこちょこつまらんトコで引っかかります)
    • good
    • 0

min、はPythonの組み込み関数名なんで、変数名には使わないほうがいいですよ。



# ダメな例
>>> import numpy as np
>>> min = np.array([10,10,10]) # これはやらん方が良い
>>> a = np.array([3,5,11])
>>> np.array([min(x) for x in zip(min, a)])

Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
np.array([min(x) for x in zip(min, a)])
TypeError: 'numpy.ndarray' object is not callable
>>>
この回答への補足あり
    • good
    • 0

>>> import numpy as np


>>> m = np.array([10, 10, 10])
>>> a = np.array([3, 5, 11])
>>> np.array([min(x) for x in zip(m, a)])
array([ 3, 5, 10])
>>>
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!