5

これは、Numpy の初心者ユーザーからの基本的な質問です。たとえば、5 行 2 列の 2D 配列があり、10 個の 2D ベクトルとして表示されます。指定されたベクトルがテーブル内にあるかどうかをテストしたいと思います。

例えば ​​:

>>> tableau = array(range(10), dtype = uint8)
>>> tableau.shape = (5,2)
>>> print tableau
[[ 0  1]
 [ 2  3]
 [ 4  5]
 [ 6  7]
 [ 8  9]]
>>> [0, 1] in tableau
True

最後の行では True が返されますが、'[0, 2] in tableau' も返されます。

今のところ、ユークリッド距離が 0 かどうかを計算しますが、もっと簡単な答えがあるはずです。

助けてくれてありがとう

4

3 に答える 3

5

一致配列でブール削減を実行できます。

([0, 1] == tableau).all(axis=1).any()
于 2013-02-25T13:40:06.920 に答える
1

any()簡単に言えば、配列を と比較するジェネレーターを使用することができますarray_equal

from numpy import array_equal

in_t = lambda x, t : any((array_equal(a,x) for a in t))

print in_t([0, 2], tableau)
print in_t([0, 1], tableau)
于 2014-07-13T07:22:32.447 に答える
0

これを解決するために、多次元のケースも処理する関数を作成しました。(@ecatmur の回答は 2 次元では完全に機能しますが、1D または 3D+ では失敗します)

import numpy as np
def haselement(arr,subarr):
    '''Test if subarr is equal to one of the elements of arr.
       This is the equivalent of the "in" operator when using lists instead of arrays.'''
    arr = np.asarray(arr)
    subarr = np.asarray(subarr)
    if subarr.shape!=arr.shape[1:]:
        return False
    elif arr.ndim<2:
        return (subarr==arr).any()
    else:
        boolArr = (subarr==arr)
        boolArr.resize([arr.shape[0],np.prod(arr.shape[1:])])
        return boolArr.all(axis=1).any()

tableau = np.array(range(10), dtype = np.uint8)
tableau.shape = (5,2)
haselement(tableau,[0,1])

1D は if ステートメントで処理され、ND は @ecatmur のアルゴリズムが機能するように配列を 2D にサイズ変更して処理されます。これを解決するために私が考えた他の方法は、リストの内包表記またはループを使用することでした (これは実際にはより効率的ですが、リストが長く、要素が先頭に近い場合に限られます)。それでも、これはもっと派手に見えます。

ライブラリから使用したい場合は、ここで関数を見つけることもできます。

https://github.com/davidmashburn/np_utils (明らかな免責事項、私は著者です;))

于 2014-06-18T21:52:52.380 に答える