Astropy: 構造化されたdtypeを使用してテーブルを初期化すると、一貫性のない/紛らわしい結果が生成されます

作成日 2020年05月23日  ·  3コメント  ·  ソース: astropy/astropy

説明

Facebookグループでの議論により、 dtypeを渡すことで、既存のテーブルから新しい空のテーブルを作成できることがわかりました。

>>> oldtable.dtype
dtype([('wavelength', '<f8'), ('flux', '<f4'), ('uncertainty', '<f4')])
>>> Table(dtype=oldtable.dtype)
<Table length=0>
wavelength   flux  uncertainty
 float64   float32   float32  
---------- ------- -----------

より歩行者の方法で初期化することも同様に可能です

>>> newtable = Table(names=oldtable.colnames, dtype=[dt for n, dt in oldtable.dtype.descr])

ただし、 namesがすでに指定されている場合は、古いdtype直接使用すると、次の例外がスローされます。

 >>> newtable = Table(names=oldtable.colnames, dtype=oldtable.dtype)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/derek/lib/python3.8/site-packages/astropy/table/table.py", line 621, in __init__
    self._check_names_dtype(names, dtype, n_cols)
  File "/Users/derek/lib/python3.8/site-packages/astropy/table/table.py", line 873, in _check_names_dtype
    raise ValueError(f'{inp_str} must be a list or None')
ValueError: dtype must be a list or None

>>> newtable = Table(names=oldtable.colnames, dtype=oldtable.dtype.descr)
Traceback (most recent call last):
  File "/Users/derek/lib/python3.8/site-packages/astropy/table/table.py", line 1088, in _convert_data_to_col
    col = col_cls(name=name, data=data, dtype=dtype,
  File "/Users/derek/lib/python3.8/site-packages/astropy/table/column.py", line 879, in __new__
    self = super().__new__(
  File "/Users/derek/lib/python3.8/site-packages/astropy/table/column.py", line 254, in __new__
    if np.dtype(dtype).char == 'S':
TypeError: data type 'wavelength' not understood

Tableが構造化配列で初期化されている場合も同じことが起こります。

予想される行動


Tableは、より意味のあるエラーを発生させるか、(おそらくできれば)構造化されたdtype受け入れる必要があります。おそらく、 dtype.namesが指定されたnames置き換えられるという警告が表示されます。

実際の動作



上記を参照。 ドキュメントnewtable = oldtable[:0].copy()推奨されている方法は機能しますが(さらにunitプロパティをコピーするという利点があります)、 dtype単独で指定する場合と、 namesと一緒に指定する場合の動作が異なります。

https://github.com/astropy/astropy/blob/eeb9b7ac0e18b262fae64cd2fa46d0e1cff1e4d5/astropy/table/table.py#L592 -L594

"アンパック" dtype自動的に他のnamesの情報が入手できない、と同じで行われるかもしれないnamesに設定(ただし、廃棄dtype.namesするので、 namesは確かに優先されるべきです)。

少し関連したメモとして、 units=として渡すことができる形式で、テーブル列のすべての単位を直接取得するメソッドがあると便利です。 もちろん、 newtable = oldtable[:0].copy()メソッドに戻ることもできますが、名前やdtypeを変更する必要がある場合は、このようなオプションが便利です。

システムの詳細

Astropyバージョン4.2.dev112 + g595484597。
日付:2020-05-22T19:44:39
プラットフォーム:macOS-10.12.6-x86_64-i386-64bit
実行可能ファイル:/sw/bin/python3.8
完全なPythonバージョン:
3.8.3(デフォルト、2020年5月14日、22:17:35)
[Clang 9.0.0(clang-900.0.39.2)]

パッケージバージョン:
Numpy:1.19.0rc1
Scipy:1.4.1
Matplotlib:3.2.1
h5py:2.9.0
パンダ:利用できません
Cython:0.29.16

Bug table

全てのコメント3件

ありがとう! oldtableは正確には何

import numpy as np
from astropy.table import Table
arr = np.ones(2, dtype=np.dtype([('A', 'i'), ('B', 'f4'), ('C', 'f8')]))
tab1 = Table(arr)
tab1

tab2 = Table(dtype=tab1.dtype)
tab2

tab3 = Table(names=['X', 'Y', 'Z'], dtype=[dt for n, dt in tab1.dtype.descr])
tab3

次の出力を生成します。

<Table length=2>
  A      B       C   
int32 float32 float64
----- ------- -------
    1     1.0     1.0
    1     1.0     1.0

<Table length=0>
  A      B       C   
int32 float32 float64
----- ------- -------

<Table length=0>
  X      Y       Z   
int32 float32 float64
----- ------- -------

一方

>>> tab3 = Table(names=['X', 'Y', 'Z'], dtype=tab1.dtype)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/sw/lib/python3.8/site-packages/astropy/table/table.py", line 621, in __init__
    self._check_names_dtype(names, dtype, n_cols)
  File "/sw/lib/python3.8/site-packages/astropy/table/table.py", line 873, in _check_names_dtype
    raise ValueError(f'{inp_str} must be a list or None')
ValueError: dtype must be a list or None
>>> tab3 = Table(names=['X', 'Y', 'Z'], dtype=tab1.dtype.descr)
Traceback (most recent call last):
  File "/sw/lib/python3.8/site-packages/astropy/table/table.py", line 1088, in _convert_data_to_col
    col = col_cls(name=name, data=data, dtype=dtype,
  File "/sw/lib/python3.8/site-packages/astropy/table/column.py", line 879, in __new__
    self = super().__new__(
  File "/sw/lib/python3.8/site-packages/astropy/table/column.py", line 254, in __new__
    if np.dtype(dtype).char == 'S':
TypeError: data type 'A' not understood

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/sw/lib/python3.8/site-packages/astropy/table/table.py", line 624, in __init__
    init_func(data, names, dtype, n_cols, copy)
  File "/sw/lib/python3.8/site-packages/astropy/table/table.py", line 955, in _init_from_list
    col = self._convert_data_to_col(col, copy, default_name, dtype, name)
  File "/sw/lib/python3.8/site-packages/astropy/table/table.py", line 1092, in _convert_data_to_col
    raise ValueError('unable to convert data to Column for Table')
ValueError: unable to convert data to Column for Table



md5-9116051d321cf97db138d26f38a78850



>>> tab3 = Table(arr, dtype=tab1.dtype.descr)
Traceback (most recent call last):
  File "/sw/lib/python3.8/site-packages/astropy/table/table.py", line 1088, in _convert_data_to_col
    col = col_cls(name=name, data=data, dtype=dtype,
  File "/sw/lib/python3.8/site-packages/astropy/table/column.py", line 879, in __new__
    self = super().__new__(
  File "/sw/lib/python3.8/site-packages/astropy/table/column.py", line 254, in __new__
    if np.dtype(dtype).char == 'S':
TypeError: data type 'A' not understood

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/sw/lib/python3.8/site-packages/astropy/table/table.py", line 624, in __init__
    init_func(data, names, dtype, n_cols, copy)
  File "/sw/lib/python3.8/site-packages/astropy/table/table.py", line 1108, in _init_from_ndarray
    self._init_from_list(cols, names, dtype, n_cols, copy)
  File "/sw/lib/python3.8/site-packages/astropy/table/table.py", line 955, in _init_from_list
    col = self._convert_data_to_col(col, copy, default_name, dtype, name)
  File "/sw/lib/python3.8/site-packages/astropy/table/table.py", line 1092, in _convert_data_to_col
    raise ValueError('unable to convert data to Column for Table')
ValueError: unable to convert data to Column for Table

#10419を参照してください。

このページは役に立ちましたか?
0 / 5 - 0 評価