
No.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臭い解決法ですね。
No.3
- 回答日時:
さぁ、そうなると分からんですね。
こっちだと「上手く動いてる」としかいいようないです。
ちなみにこっちの環境だとPython 2.7.12、OSはLinuxですが、Python3.x系を使ってるんですかね?
(毎回言ってますが、Pythonの質問を投げる場合、2.x系なのか3.x系なのか付加しないと、ちょこちょこつまらんトコで引っかかります)
No.2
- 回答日時:
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
>>>
No.1
- 回答日時:
>>> 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])
>>>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
STLのvectorで作った配列をメン...
-
CArrayの要素としてCStringArra...
-
mb_encode_numericentityでタグ...
-
正規表現
-
連想配列に追加ってできるン?
-
読み(あ行~わ行)ごとに分け...
-
多次元配列をエンコードする関...
-
2次元配列を1次元配列にするには
-
PHPでCSVを出力するさいに、ル...
-
phpで、配列の値が意図せず変わ...
-
delphi 2次元配列がわかりません
-
配列の添え字が小数だとどうなる?
-
Delphiで別unitで宣言した「TAr...
-
CArrayのソート
-
C言語の配列をPush(追加)する...
-
プルダウンメニューにDBの内容...
-
file_existsでファイル名の部分...
-
行数が30万件ほどあるCSVから、...
-
String だと「 ByRef引数の型が...
-
マッチング処理(1:N)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
cakephpでのトランザクション処...
-
行列
-
読み(あ行~わ行)ごとに分け...
-
特定の文からメールアドレスの...
-
c言語 単位行列
-
STLのvectorで作った配列をメン...
-
多次元配列をエンコードする関...
-
2次元配列を1次元配列にするには
-
phpで、配列の値が意図せず変わ...
-
Delphiで別unitで宣言した「TAr...
-
連想配列に追加ってできるン?
-
正規表現
-
配列の並びについて
-
PHPでCSVを出力するさいに、ル...
-
pascalについて知りたいのです...
-
文字列の取得について
-
ファイルの書き込みについて教...
-
数独かを判断するプログラム
-
文字列の並び替え
おすすめ情報
TypeError: 'numpy.ndarray' object is not callable
のエラーが出ます。
min -> m
にしても同じエラーが出るようなのですが?
ごめんなさい!!
pythonのインターラクティブシェルを立ち上げ直したらうまくいきました。
pythonは3系を使っています。
mask = (a < m)
m[mask] = a[mask]
でも動くようですが、maskの情報をif()文に取り込んで、書くようなことってできないのでしょうか?