1

複数の名前付きフィールドを持つ既存の配列を取得し、元の dtype と等しい階層型 dtype を持つ 1 つのフィールドを持つ新しい配列を作成 (またはその場で変更) したいと考えています。あれは、

newarray = np.array(oldarray, dtype=[('old',oldarray.dtype)])

newarray['old']~と形状および構造が同一であるようにoldarray

次に例を示します。

In [1]: import numpy as np

In [2]: dt = np.dtype([('name',np.str_,2),('val',np.float_)])

In [3]: constants = np.array([('pi',3.14),('e',2.72)],dtype=dt)

In [4]: constants
Out[4]: 
array([('pi', 3.14), ('e', 2.72)], 
      dtype=[('name', '|S2'), ('val', '<f8')])

In [5]: numbers = constants.astype([('constants',dt)])

しかし、これは私にすべてゼロを与えます:

In [6]: numbers
Out[6]: 
array([(('', 0.0),), (('', 0.0),)], 
      dtype=[('constants', [('name', '|S2'), ('val', '<f8')])])

コピーを作成しようとすると、同じ問題が発生します。

In [7]: numbers = np.array(constants,dtype=[('constants',dt)])

In [8]: numbers
Out[8]: 
array([(('', 0.0),), (('', 0.0),)], 
      dtype=[('constants', [('name', '|S2'), ('val', '<f8')])])

また:なぜこれが起こっているのか誰か知っていますか?

4

2 に答える 2

2

view元の配列を新しい dtype (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.view.html) で取得できます。

>>> import numpy as np
>>> dt = np.dtype([('name',np.str_,2),('val',np.float_)])
>>> constants = np.array([('pi',3.14),('e',2.72)],dtype=dt)
>>> 
>>> numbers = constants.view([('constants',dt)])
>>> 
>>> numbers['constants']
array([('pi', 3.14), ('e', 2.72)], 
      dtype=[('name', '|S2'), ('val', '<f8')])

結果の配列numbersは元の配列のビューであることに注意してください。そのため、一方の変更は他方にも影響します。

于 2013-01-07T13:03:24.093 に答える
0

元の配列のリストを作成することで問題を解決できます。

In [9]: numbers = np.array([constants],dtype=[('constants',dt)])

In [10]: numbers
Out[10]: 
array([[(('pi', 3.14),), (('e', 2.72),)]], 
      dtype=[('constants', [('name', '|S2'), ('val', '<f8')])])

しかし、私がそれを見ると、もちろん、リストに追加のネストがあります:

In [11]: numbers['constants']
Out[11]: 
array([[('pi', 3.14), ('e', 2.72)]], 
      dtype=[('name', '|S2'), ('val', '<f8')])

In [12]: numbers['constants']['name']
Out[12]: 
array([['pi', 'e']], 
      dtype='|S2')

私は本当にリストの最初の項目が欲しいだけです:

In [13]: numbers[0]
Out[13]: 
array([(('pi', 3.14),), (('e', 2.72),)], 
      dtype=[('constants', [('name', '|S2'), ('val', '<f8')])])

後で配列をフラット化することでこれを実現することもできます。

In [14]: numbers.flatten()
Out[14]: 
array([(('pi', 3.14),), (('e', 2.72),)], 
      dtype=[('constants', [('name', '|S2'), ('val', '<f8')])])

In [15]: numbers.flatten()['constants']
Out[15]: 
array([('pi', 3.14), ('e', 2.72)], 
      dtype=[('name', '|S2'), ('val', '<f8')])

In [16]: numbers.flatten()['constants']['name']
Out[16]: 
array(['pi', 'e'], 
      dtype='|S2')

しかし、それはハックではありませんか?最後に本当に欲しいのは、この配列です:

In [17]: numbers = np.array([(('pi', 3.14),), (('e', 2.72),)],dtype=[('constants',dt)])

In [18]: numbers['constants']
Out[18]: 
array([('pi', 3.14), ('e', 2.72)], 
      dtype=[('name', '|S2'), ('val', '<f8')])

In [19]: numbers['constants']['name']
Out[19]: 
array(['pi', 'e'], 
      dtype='|S2')

1 つの項目のリストを作成してからフラット化する必要はありません。より良いアイデアはありますか?

于 2013-01-07T05:32:36.200 に答える