2016-08-17 10 views
-2

私はこれを行うための速い方法を推測しています。そのようなnumpy配列1と2の正しい位置に基づいて3番目の配列の値を見つけよう

In[85]: xxn 
Out[85]: 
array([ 0.08333333, 0.08333333, 0.08333333, 0.08333333, 0.08333333, 
     0.08333333, 0.08333333, 0.08333333, 0.08333333, 0.25  , 
     0.25  , 0.25  , 0.25  , 0.25  , 0.25  , 
     0.25  , 0.25  , 0.25  , 0.5  , 0.5  , 
     0.5  , 0.5  , 0.5  , 0.5  , 0.5  , 
     0.5  , 0.5  , 1.  , 1.  , 1.  , 
     1.  , 1.  , 1.  , 1.  , 1.  , 
     1.  , 2.  , 2.  , 2.  , 2.  , 
     2.  , 2.  , 2.  , 2.  , 2.  , 
     3.  , 3.  , 3.  , 3.  , 3.  , 
     3.  , 3.  , 3.  , 3.  , 4.  , 
     4.  , 4.  , 4.  , 4.  , 4.  , 
     4.  , 4.  , 4.  , 5.  , 5.  , 
     5.  , 5.  , 5.  , 5.  , 5.  , 
     5.  , 5.  ]) 
yyn 
Out[86]: 
array([ 1306.89 , 1524.705, 1742.52 , 1960.335, 2178.15 , 2395.965, 
     2613.78 , 2831.595, 3049.41 , 1306.89 , 1524.705, 1742.52 , 
     1960.335, 2178.15 , 2395.965, 2613.78 , 2831.595, 3049.41 , 
     1306.89 , 1524.705, 1742.52 , 1960.335, 2178.15 , 2395.965, 
     2613.78 , 2831.595, 3049.41 , 1306.89 , 1524.705, 1742.52 , 
     1960.335, 2178.15 , 2395.965, 2613.78 , 2831.595, 3049.41 , 
     1306.89 , 1524.705, 1742.52 , 1960.335, 2178.15 , 2395.965, 
     2613.78 , 2831.595, 3049.41 , 1306.89 , 1524.705, 1742.52 , 
     1960.335, 2178.15 , 2395.965, 2613.78 , 2831.595, 3049.41 , 
     1306.89 , 1524.705, 1742.52 , 1960.335, 2178.15 , 2395.965, 
     2613.78 , 2831.595, 3049.41 , 1306.89 , 1524.705, 1742.52 , 
     1960.335, 2178.15 , 2395.965, 2613.78 , 2831.595, 3049.41 ]) 

    In[87]: zzn 
Out[87]: 
array([ 0.4837052 , 0.3976288 , 0.3076519 , 0.2105963 , 0.1015546 , 
     0.1162558 , 0.1723646 , 0.2173536 , 0.2547635 , 0.3767569 , 
     0.3196527 , 0.2606447 , 0.1983554 , 0.1291423 , 0.09786849, 
     0.1277448 , 0.1560009 , 0.1802875 , 0.3420683 , 0.2938885 , 
     0.2452067 , 0.1958042 , 0.144459 , 0.1026045 , 0.1086459 , 
     0.1256328 , 0.1419562 , 0.3090272 , 0.2726449 , 0.236535 , 
     0.200679 , 0.1647521 , 0.1310315 , 0.1132389 , 0.1129602 , 
     0.118809 , 0.284265 , 0.257173 , 0.2310047 , 0.205817 , 
     0.18154 , 0.1586908 , 0.1393701 , 0.1264879 , 0.1204383 , 
     0.2760804 , 0.2540095 , 0.2330927 , 0.2133592 , 0.1947658 , 
     0.1775263 , 0.1622754 , 0.1498286 , 0.1407699 , 0.274541 , 
     0.2560495 , 0.2387175 , 0.222547 , 0.2075007 , 0.1936717 , 
     0.1812974 , 0.1706293 , 0.1618527 , 0.2802191 , 0.2641784 , 
     0.2491889 , 0.2352521 , 0.2223443 , 0.2105051 , 0.199825 , 
     0.1903785 , 0.1822064 ]) 

IはxxnにおけるAAマッチング位置に基づいてzzn値を取得することができる最速の方法を把握したいとyynた:私は、3×の座標を表し、同じサイズの配列、Y、のようなZを有します[1、2395.965]は配列zznの[1、2395.965]の位置マッチング位置である0.1310315を返します。

パンダで私はzz [(xx == 1)&(yy == 2395.965)] = 0.1310315ですが、残念ながらそれ以上のループがあり、遅くなります。

ご協力いただきありがとうございます。

編集:

私の電流ループは、このようなパンダを使用している座標

for coordinate in df.itertuples(): 
    sTL = zz[(xx == x_match) & (yy == y_match)].values 
    sBL = zz[(xx == x_match) & (yy == sB)].values 
    sTR = zz[(xx == sR) & (yy == y_match)].values 
    sBR = zz[(xx == sR) & (yy == sB)].values 

を持っているがx_match、y_match、SR、SBが値であり、あなたがxxnyynを積み重ねることができ100kの行

+0

私はあなたが配列でもループする必要はないと思います。あなたはそれを実装するためにどのようにループしていますか? – Divakar

+0

それはカスタム補間です、私は異なるxxnとyyn座標のループで複数のxxn yynとzznを与えています。そして、私はzzn相当物を必要とします –

+0

サンプルデータでloopy実装を共有できますか? – Divakar

答えて

1

を持っています1つの配列にこの新しい配列を検索し、結果を使用して値をzznから得る:

a = numpy.vstack((xxn, yyn)).T 

idx = numpy.all(a==numpy.array([1.0, 2395.965]), axis=1) 
print zzn[idx] 
+0

私は非常に速くも感謝を見る! –

+0

私は(OPによって) '== np.array([....])'を 'np.isclose(a、np.array(...))'で ' = '演算子は浮動小数点数ではうまく動作しません。 –

0

は、調査の後、私はこのようにそれを行うための簡単な方法を考え出し:

np.where((xxn == x_match) & (yyn ==y_match), zzn, 0).sum() 

これはパンダと同等よりもはるかに高速になります。

%timeit np.where((xxn == x_match) & (yyn ==y_match), zzn, 0).sum() 
The slowest run took 8.72 times longer than the fastest. This could mean 

that an intermediate result is being cached. 
100000 loops, best of 3: 8.19 �s per loop 

%timeit zz[(xx == x_match) & (yy == y_match)].values 
1000 loops, best of 3: 1.43 ms per loop 
0

は、ここで私はパンダでそれを行うだろう方法は次のとおりです。

xyz = pd.DataFrame({'x':xxn, 'y':yyn, 'z':zzn}) 
xyz.set_index(['x', 'y'], inplace=True) 

hunt = pd.DataFrame({'x':df[:,0], 'y':df[:,1]}) # coords to look for 
print hunt.join(xyz, ['x', 'y']) 
関連する問題