2016-08-09 7 views
0

np.arrayをリストに最初に変換する必要なしに、np.arrayとセットを交差させたい(プログラムを実行できないレベルにまで遅くする)。np.arrayとsetの共通部分

は、ここに私の現在のコードです:(私はB、G、RのrawCaptureからこのデータを取得していますことに注意してください、とselection_dataは、単に事前のセットです。)

def GreenCalculations(data): 
    data.reshape(1,-1,3) 
    data={tuple(item) for item in data[0]} 
    ColourCount=selection_data & set(data) 
    Return ColourCount 

を今私が思う私の現在の問題があります私は、データ[0]のせいで、写真の最初の部分を比較しているだけです。すべての行をループすることは可能ですか?

注:tolist()には多くの時間がかかります。

答えて

0

最初にサンプルdata。そのインプレースをするだろう

In [793]: data.reshape(1,-1,3) 

data.shape=(1,-1,3):私は、メソッドが新しい形で新しい配列を返しますが、インプレースでそれを変更しないDTYPE uint8

In [791]: data=np.random.randint(0,256,(8,8,3),dtype=np.uint8) 

reshapeと、それはnxnx3配列だ推測しています。しかし、なぜ最初の1?代わりに

:私の場合は

In [795]: aset={tuple(item) for item in data.reshape(-1,3)} 
In [796]: aset 
Out[796]: 
{(3, 92, 60), 
(5, 211, 227), 
(6, 185, 183), 
(9, 37, 0), 
.... 

In [797]: len(aset) 
Out[797]: 64 

64個のユニークなアイテムのセット - 私が値に

あなたがdo-nothing data.reshapeライン、あるように見える理由のため{tuple(item) for item in data[0]}アカウントを生成する方法与えられた驚くべきことではありません画像の1行目で作業しています。

私はselection_dataを推測しているが、このような同様の3項目のタプル、次のとおりです。

In [801]: selection_data = {tuple(data[1,3,:]), (1,2,3), tuple(data[5,5,:])} 
In [802]: selection_data 
Out[802]: {(1, 2, 3), (49, 132, 26), (76, 131, 16)} 
In [803]: selection_data&aset 
Out[803]: {(49, 132, 26), (76, 131, 16)} 

あなたがtolistを使用しようとする場所をあなたは言いませんが、私はタプルの集合を生成する際に推測しています。

しかし、不思議なことに、tolistスピードアップコンバージョン:だから

In [808]: timeit {tuple(item) for item in data.reshape(-1,3).tolist()} 
10000 loops, best of 3: 57.7 µs per loop 
In [809]: timeit {tuple(item) for item in data.reshape(-1,3)} 
1000 loops, best of 3: 239 µs per loop 
In [815]: timeit data.reshape(-1,3).tolist() 
100000 loops, best of 3: 19.8 µs per loop 
In [817]: timeit {tuple(item.tolist()) for item in data.reshape(-1,3)} 
10000 loops, best of 3: 100 µs per loop 

をリストし、設定操作のこの種を行うため、我々としても、すぐにリスト形式にジャンプすることがあります。

numpyには、いくつかの機能があります。たとえば、np.in1dです。これは1d配列の操作だけですが、unique rowの質問でも実証されているように、2次元配列を構造化配列として見ることで回避できます。

In [883]: selection=[data[1,3,:],[1,2,3],data[5,5,:]] 
In [885]: selection=np.array(selection,np.uint8).view(dt) 
In [886]: selection 
Out[886]: 
array([[(49, 132, 26)], 
     [(1, 2, 3)], 
     [(76, 131, 16)]], 
     dtype=[('f0', 'u1'), ('f1', 'u1'), ('f2', 'u1')]) 

もそうdata1で発見されselection内の項目は次のとおりです:

In [880]: dt=np.dtype('uint8,uint8,uint8') 
In [881]: data1=data.reshape(-1,3).view(dt).ravel() 
In [882]: data1 
Out[882]: 
array([(41, 145, 254), (138, 144, 7), (192, 241, 203), (42, 177, 215), 
     (78, 132, 87), (221, 176, 87), (107, 171, 147), (231, 13, 53), 
     ... 
     dtype=[('f0', 'u1'), ('f1', 'u1'), ('f2', 'u1')]) 

が同じ構造化された配列を自然と選択を構築:私はこれまでのところ取得するために周りいじる必要がありました

In [888]: np.in1d(selection,data1) 
Out[888]: array([ True, False, True], dtype=bool) 

であり、選択中のdata1の項目は、

In [890]: np.where(np.in1d(data1,selection)) 
Out[890]: (array([11, 45], dtype=int32),) 

または解明さ形状

In [891]: np.where(np.in1d(data1,selection).reshape(8,8)) 
Out[891]: (array([1, 5], dtype=int32), array([3, 5], dtype=int32)) 

Iはselectionを生成するために使用したのと同じ(1,3)及び(5,5)の商品。

in1dタイミングが競争している:私が正しくあなたの質問を理解していれば

In [892]: %%timeit 
    ...: data1=data.reshape(-1,3).view(dt).ravel() 
    ...: np.in1d(data1,selection) 
    ...: 
10000 loops, best of 3: 65.7 µs per loop 

In [894]: timeit selection_data&{tuple(item) for item in data.reshape(-1,3).tolist()} 
10000 loops, best of 3: 91.5 µs per loop 
+0

'tolist'は変換を高速化することが期待されています。 Numpyオブジェクトは、Pythonオブジェクトではなく、生の値としてデータを格納します。つまり、Pythonからのすべてのアクセスには値のラッパーオブジェクトを作成するためにnumpyが必要です。これは反復処理の際にも行われます。 'tolist'メソッドはすべてのラッパーを一つの最適化されたCループに作成し、それらをPythonリストに入れます。後続の反復はPythonリスト上にあります。これはラッパーオブジェクトを作成する必要がないため高速です。 – Bakuriu

0

(と私が行うことを100%確実ではないイム;しかしhpauljと同じ仮定を使用して)、あなたの問題は、使用してこれを解決することができますnumpy_indexedパッケージ:

import numpy_indexed as npi 
ColourCount = npi.intersection(data.reshape(-1, 3), np.asarray(selection_data)) 

、それは再構成アレイ並びにそれがベクトル化方法で交差点を検索しているの長-3 ndarraysの配列などのセットの両方を扱います。

関連する問題