2016-05-03 7 views
1

なぜ、次の作品np.arrayするCOL名を追加します。これはそうではないpython-

mat = np.array(
    [(0,0,0), 
    (0,0,0), 
    (0,0,0)], 
    dtype=[('MSFT','float'),('CSCO','float'),('GOOG','float') ] 
    ) 

を:

mat = np.array(
    [[0]*3]*3, 
    dtype=[('MSFT','float'),('CSCO','float'),('GOOG','float')] 
    ) 

にはどうすれば

のように簡単に行列を作成することができます

[[None]*M]*N

ただし、列に名前を割り当てることができるタプルはありますか?

答えて

3

あなたは列名を保持したままマージしたい1Dアレイ(列)の数を持っている場合は、あなたがnp.rec.fromarraysを使用することができます。

>>> dt = np.dtype([('a', float),('b', float),('c', float),]) 
>>> np.rec.fromarrays([[0] * 3 ] * 3, dtype=dt) 
rec.array([(0.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0)], dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')]) 

これはあなたの列ができているレコード/構造化された配列を与えます異なるデータ型の名前&

+0

'rec.fromarrays'は、構造化配列を塗りつぶすcopy-by-fieldsメソッドを使用するのは興味深いことです。 – hpaulj

4

私はディスプレイがタプルのリストが表示されていることを、あなたのDTYPE

In [548]: dt=np.dtype([('MSFT','float'),('CSCO','float'),('GOOG','float') ]) 

In [549]: A = np.zeros(3, dtype=dt) 

In [550]: A 
Out[550]: 
array([(0.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0)], 
     dtype=[('MSFT', '<f8'), ('CSCO', '<f8'), ('GOOG', '<f8')]) 

通知にゼロの配列を作ります。これは意図的なことで、2d(普通の)配列の行からdtypeレコードを区別するためです。

つまり、配列を作成するときや値を割り当てるときには、タプルのリストも使用する必要があります。

In [554]: ll = np.arange(9).reshape(3,3).tolist() 
In [555]: ll 

In [556]: A[:]=ll 
... 
TypeError: a bytes-like object is required, not 'list' 

を私はタプルのリストにそれを回す場合:

例えば者は、リストのリストを作ってみよう

In [557]: llt = [tuple(i) for i in ll] 

In [558]: llt 
Out[558]: [(0, 1, 2), (3, 4, 5), (6, 7, 8)] 

In [559]: A[:]=llt 

In [560]: A 
Out[560]: 
array([(0.0, 1.0, 2.0), (3.0, 4.0, 5.0), (6.0, 7.0, 8.0)], 
     dtype=[('MSFT', '<f8'), ('CSCO', '<f8'), ('GOOG', '<f8')]) 

割り当てが正常に動作します。このリストはarrayで直接使用することもできます。

In [563]: A[0]=(10,12,14) 

設定値の他の一般的な方法は、フィールド単位でフィールドである:一つのレコードに

In [561]: np.array(llt, dtype=dt) 
Out[561]: 
array([(0.0, 1.0, 2.0), (3.0, 4.0, 5.0), (6.0, 7.0, 8.0)], 
     dtype=[('MSFT', '<f8'), ('CSCO', '<f8'), ('GOOG', '<f8')]) 

同様に代入値がないリスト、タプルを必要とします。それは、リストや配列で行うことができます。他の回答で推奨

In [564]: A['MSFT']=[100,200,300] 

In [565]: A 
Out[565]: 
array([(100.0, 12.0, 14.0), (200.0, 4.0, 5.0), (300.0, 7.0, 8.0)], 
     dtype=[('MSFT', '<f8'), ('CSCO', '<f8'), ('GOOG', '<f8')]) 

np.rec.fromarrays方法は、コピー・バイ・フィールドのアプローチを使用して終わります。

arrayList = [sb.asarray(x) for x in arrayList] 
<determine shape> 
<determine dtype> 
_array = recarray(shape, descr) 
# populate the record array (makes a copy) 
for i in range(len(arrayList)): 
    _array[_names[i]] = arrayList[i] 
+1

これはかなり上に現れます。リストのリストの場合は、タプルのリストではなく受け入れ可能な入力とみなされているという理由がありますか?私はこれについての決定的な論理的根拠をまだ見つけていない。 –

+1

入力構文が表示スタイルをエコーすることは論理的です。しかし、私はgithubの問題や開発者フォーラムの問題については検討していません。それは初心者の方がdtypeフィールドと2dカラムの違いを見落としてしまうことがあります。特にcsvをロードするときはそうです。 Someelseはなぜ構造化アレイとフラットなものを追加できないのかと尋ねました。 – hpaulj

+0

私は 'dtype'エントリが2フィールドシーケンスとして定義され、したがって不変に設定されているという事実からの議論を想像することができます。 – mtzl