8

Python 3 でタプルに対する要素ごとの操作を可能にする組み込み関数はありますか? そうでない場合、これらの操作を実行する「pythonic」の方法は何ですか?

例: と のパーセント差を取得し、それらをいくつかのしきい値と比較したいと考えてabますth

>>> a = (1, 2, 4)
>>> b = (1.1, 2.1, 4.1)
>>> # compute pd = 100*abs(a-b)/a = (10.0, 5.0, 2.5)
>>> th = 3
>>> # test threshold: pd < th => (False, False, True)
4

6 に答える 6

11

組み込みの方法はありませんが、非常に簡単な方法があります。

[f(aItem, bItem) for aItem, bItem in zip(a, b)]

. . . 要素ごとに適用する関数はどこにfありますか。あなたの場合:

[100*abs(aItem - bItem)/aItem < 3 for aItem, bItem in zip(a, b)]

特に長いタプルでNumpyこれを頻繁に行っていることに気付いた場合は、多くの一般的なベクトル関数 (基本演算、三角関数など) が要素ごとに適用されるベクトル演算の完全な機能を備えたシステムを提供する を参照することをお勧めします。

于 2012-08-24T16:35:19.150 に答える
6

マップ機能

>>> a = (1, 2, 4)
>>> b = (1.1, 2.1, 4.1)
>>> map(lambda a,b: 100*abs(a-b)/a < 3, a, b)
[False, False, True]

編集

もちろん、マップの代わりに、BrenBarn が http://docs.python.org/tutorial/datastructures.html#nested-list-comprehensionsを行ったように、リスト内包表記を使用できます。

編集 2 zip が削除されました。DSM が zip が不要であることを指摘してくれてありがとう

于 2012-08-24T16:35:56.850 に答える
5

なぜ NumPy を使わないのですか?

import numpy as np
a = np.array([1,2,4])
b = np.array([1.1, 2.1, 4.1])

pd = 100*abs(a-b)/a # result: array([ 10. ,   5. ,   2.5])
th = 3
pd < th # result: array([False, False,  True], dtype=bool)
于 2012-08-24T16:48:58.273 に答える
1

私はそのような操作を認識していません。おそらく、Python の関数型プログラミング機能の一部は機能しますが (マップ?リデュース?)、リスト内包表記 (またはリストが必要ない場合はジェネレーター) をまとめるのは比較的簡単です:

[100*abs(j-b[i])/j < 3 for i,j in enumerate(a)]
[False, False, True]

元の、より明示的/詳細なバージョンの非常に優れた単純化を指摘してくれた @delnan に感謝します。

[True if 100*abs(j-b[i])/j < 3 else False for i,j in enumerate(a)]
于 2012-08-24T16:32:57.910 に答える
0
def pctError(observed, expected):
    return (observed-expected)/expected * 100.0

a = (1, 2, 4)
b = (1.1, 2.1, 4.1)
th = 3

pctErrors = map(lambda t:pctError(*t), zip(a,b))
# returns [-9.091, -4.76, -2.44]

map(lambda x: x < th, pctErrors)
[x < th for x in pctErrors]
# both return [True, True, True]

# or if you always need absolute % errors
map(lambda x: abs(x) < th, pctErrors)
[abs(x) < th for x in pctErrors]
# both return [False, False, True]
于 2012-08-24T16:43:18.360 に答える
0

Pythonic の方法は、リスト内包表記を使用していると言えます。

いつa = (1, 2, 4)b = (1.1, 2.1, 4.1)

次に、1行で:

TEST = [100*abs(a[i]-b[i])/a[i] > th for i in range(len(A))]
于 2012-08-24T16:35:42.643 に答える