2016-09-17 7 views
0

forループを使用せずにオブジェクトのnp.arrayの特定の属性に1D numpy配列をコピーできますか? "DIST" 配列でobjarray内のすべてのPlotInputGridDataオブジェクトの "割合" の特性を満たすために、私はこのようなものを使用します。オブジェクトのnp.arrayの特定の属性にフラットな配列をコピーする

import numpy as np 

class PlotInputGridData(object): 
    def __init__(self): 
     self.rangemin = 0 
     self.rangemax = 0 
     self.rangelabel = '' 
     self.percentage = 0 
     self.number = 0 

objarray = np.arange(6, dtype=PlotInputGridData) 
for i in range(objarray.size): 
    t = PlotInputGridData() 
    objarray[i] = t 

dist = np.array([52, 26, 12, 6, 3, 1], dtype=np.int) 

for i in range(dist.size): 
    objarray[i].percentage = dist[i] 

を私は

  • objarrayを行う必要があります[0] .percentage = DIST [0]
  • objarray [1] .percentage = DIST [1]
  • ...など

がオンdist []をobjarray []にコピーする方法は、最後の2行でforループを使わずに、より簡潔な方法でパーセンテージをコピーする方法がありますか?

+1

オブジェクト配列は、表形式のデータを表し、あなたが定義したクラスは、行を表している場合、あなたがより良いだろうPandas DataFrameでオフにできます。これにより、これらのループのない操作(おそらく他に必要なもの)を実行できます。 – YXD

+0

ありがとうYXD、それは良い提案です。私はパンダがこれをもっと簡単にすることができると認識していますが、numpyだけを使って解決策があるかどうかを知りたいと思います。 –

+0

'def __pow __(self、x):self.percentage = x'のようないくつかの演算をPlotInputGridDataに定義し、後で' objarray ** dist'と言うこともできますが、ループと比較してスピードアップはありません。私は正しい方法がウォーレンWeckessers答えに表示されると思います – dnalow

答えて

3

forループなしでその割り当てを行う方法はないと思います。

オブジェクトの配列の代わりにstructured arrayを使用した場合は、これを実行できます。クラスPlotInputGridDataはわずかなフィールドなので、保持するデータはPythonクラスの代わりに構造化データ型として簡単に表現できます。例えば

In [15]: grid_data_type = np.dtype([('rangemin', float), 
    ...:       ('rangemax', float), 
    ...:       ('rangelabel', 'S16'), 
    ...:       ('percentage', float), 
    ...:       ('number', int)]) 

grid_data_typeは、5つのフィールドを持つ構造化データ型です。 (必要に応じて、個々のフィールドの種類を変更してください。)このデータ型はnumpyの配列のdtypeとして使用することができる。

In [16]: a = np.zeros(6, dtype=grid_data_dtype) 

In [17]: dist = np.array([52, 26, 12, 6, 3, 1]) 

以下が'percentage'分野アレイdistを割り当て:

In [18]: a['percentage'] = dist 

aを見てみましょう:

In [19]: a 
Out[19]: 
array([(0.0, 0.0, b'', 52.0, 0), (0.0, 0.0, b'', 26.0, 0), 
     (0.0, 0.0, b'', 12.0, 0), (0.0, 0.0, b'', 6.0, 0), 
     (0.0, 0.0, b'', 3.0, 0), (0.0, 0.0, b'', 1.0, 0)], 
     dtype=[('rangemin', '<f8'), ('rangemax', '<f8'), ('rangelabel', 'S16'), ('percentage', '<f8'), ('number', '<i8')]) 

In [20]: a[0] 
Out[20]: (0.0, 0.0, b'', 52.0, 0) 

In [21]: a['percentage'] 
Out[21]: array([ 52., 26., 12., 6., 3., 1.]) 
+0

ありがとう@warren!私の評判は私の答えをアップさせませんが、それは意図どおりに機能し、コードを簡潔かつ読みやすいものにします。構造化された配列を使うことは、この特定の場合にクラスを使用する必要がないので、最良の選択肢のようです。 –

関連する問題