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
と一緒に指定する場合の動作が異なります。
"アンパック" 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
ありがとう! 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を参照してください。