Sebuah diskusi di grup Facebook mengemukakan bahwa tabel baru yang kosong dapat dibuat dari tabel yang ada dengan meneruskan dtype
:
>>> oldtable.dtype
dtype([('wavelength', '<f8'), ('flux', '<f4'), ('uncertainty', '<f4')])
>>> Table(dtype=oldtable.dtype)
<Table length=0>
wavelength flux uncertainty
float64 float32 float32
---------- ------- -----------
dan sama mungkin untuk menginisialisasinya dengan cara yang lebih pejalan kaki
>>> newtable = Table(names=oldtable.colnames, dtype=[dt for n, dt in oldtable.dtype.descr])
tetapi langsung menggunakan dtype
jika names
sudah ditentukan melempar pengecualian ini:
>>> 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
Hal yang sama terjadi ketika Table
diinisialisasi dengan array terstruktur.
Table
harus memunculkan kesalahan yang lebih berarti, atau (mungkin lebih disukai) menerima dtype
terstruktur, mungkin dengan peringatan bahwa dtype.names
akan diganti dengan names
ditentukan
Lihat di atas. Sementara metode yang direkomendasikan dalam dokumen newtable = oldtable[:0].copy()
berfungsi (dan memiliki keuntungan untuk menyalin properti unit
), perilaku yang tidak sesuai antara menetapkan dtype
saja, dan bersama-sama dengan names
berpotensi membingungkan, dan pengecualiannya tidak terlalu jelas.
"membongkar" dtype
secara otomatis ketika tidak ada informasi names
yang tersedia, dan hal yang sama dapat dilakukan dengan set names
(tetapi membuang dtype.names
, karena names
tentu harus diprioritaskan).
Pada catatan yang sedikit terkait, akan lebih mudah untuk memiliki metode untuk secara langsung mendapatkan semua unit untuk kolom tabel dalam bentuk yang dapat diteruskan sebagai units=
. Tentu saja seseorang dapat kembali ke metode newtable = oldtable[:0].copy()
, tetapi jika ingin memodifikasi nama atau tipe d, opsi seperti itu akan berguna.
Astropy versi 4.2.dev112+g595484597.
Tanggal: 22-05-2020T19:44:39
Platform: macOS-10.12.6-x86_64-i386-64bit
Dapat dieksekusi: /sw/bin/python3.8
Versi Python Lengkap:
3.8.3 (default, 14 Mei 2020, 22:17:35)
[Dentang 9.0.0 (dentang-900.0.39.2)]
Versi paket:
Numpy: 1.19.0rc1
Scipy: 1.4.1
Matplotlib: 3.2.1
h5py: 2.9.0
Panda: tidak tersedia
Cython: 0.29.16
Terima kasih! Apa sebenarnya oldtable
? Apakah mungkin untuk memberikan cuplikan yang sepenuhnya dapat direproduksi?
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
menghasilkan keluaran berikut:
<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
----- ------- -------
sedangkan
>>> 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
Lihat #10419.