Astropy: Inisialisasi Tabel dengan tipe d terstruktur menghasilkan hasil yang tidak konsisten/membingungkan

Dibuat pada 23 Mei 2020  ·  3Komentar  ·  Sumber: astropy/astropy

Keterangan

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.

Perilaku yang diharapkan


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

Perilaku sebenarnya



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.

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

"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.

Detail Sistem

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

Bug table

Semua 3 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat