Numpy: Enh: Fungsi pembuatan array objek

Dibuat pada 2 Jun 2015  ·  4Komentar  ·  Sumber: numpy/numpy

Seperti yang dibahas dalam edisi #5303, saat ini tidak mungkin untuk membuat array objek dtype yang berisi urutan yang sama panjangnya, karena urutannya secara otomatis dibaca sebagai elemen array. Ada saran untuk hanya melakukan ini untuk daftar, tetapi ini akan menjadi pemutusan kompatibilitas mundur yang besar dan akan membutuhkan periode penghentian yang lama.

Pendekatan lain adalah memiliki fungsi secara eksplisit untuk membuat array dengan objek dtype. Mungkin ini bisa disebut "objectarray". Default untuk fungsi ini adalah mengambil urutan, dan mempertimbangkan setiap elemen urutan sebagai elemen dalam array objek 1D.

Fungsi tersebut, bagaimanapun, dapat memiliki argumen opsional "ndim" atau "kedalaman", yang dapat digunakan untuk menentukan berapa banyak tingkat urutan yang harus dianggap sebagai bagian dari larik. Ini akan default ke 0 (hanya level terluar yang dipertimbangkan). Ini akan menimbulkan pengecualian jika dimensi tidak cocok.

Perhatikan bahwa pendekatan ini tidak eksklusif satu sama lain dengan alternatif, tetapi memiliki keuntungan bahwa itu tidak akan merusak kompatibilitas ke belakang.

Jadi misalnya:

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))])
>>> arr
array([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], dtype=object)
>>> arr.shape
(2,)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=1)
>>> arr
array([[(1, 2, 3), (4, 5, 6)],
       [(7, 8, 9), (10, 11, 12)]], dtype=object)
>>> arr.shape
(2, 2)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=2)
>>> arr
array([[[1, 2, 3],
        [4, 5, 6]],

       [[7, 8, 9],
        [10, 11, 12]]], dtype=object)
>>> arr.shape
(2, 2, 3)

Komentar yang paling membantu

Semoga saya tidak melewatkan apa pun, tetapi bagi saya tampaknya argumen ndmax tidak hanya akan menyelesaikan masalah yang dilaporkan ("_membuat array objek dtype yang berisi urutan panjang yang sama_"), tetapi juga membawa peningkatan kinerja kasus-kasus di mana misalnya objek terakhir dalam input bukan daftar (atau daftar dengan panjang yang berbeda). Lihat juga pertanyaan ini .

Semua 4 komentar

Saya pikir cara termudah untuk memasukkan daftar berukuran sama ke dalam array objek adalah dalam dua langkah:

>>> a = empty((2,), dtype=np.object)
>>> a[:] = [[1,2,3],[4,5,6]]

>>> b = empty((2,3), dtype=np.object)
>>> b[:] = [[1,2,3],[4,5,6]]

Kemungkinan implementasi objectarray akan bekerja seperti ini.

Ya, itu adalah cara terbaik saat ini, tetapi itu tidak perlu bertele-tele. Oleh karena itu ide ini.

Saya berharap bahwa implementasi dari ide ini hanya dapat melewati konversi otomatis yang digunakan dalam fungsi array dan menggantinya sendiri dengan konstruktor ndarray .

Semoga saya tidak melewatkan apa pun, tetapi bagi saya tampaknya argumen ndmax tidak hanya akan menyelesaikan masalah yang dilaporkan ("_membuat array objek dtype yang berisi urutan panjang yang sama_"), tetapi juga membawa peningkatan kinerja kasus-kasus di mana misalnya objek terakhir dalam input bukan daftar (atau daftar dengan panjang yang berbeda). Lihat juga pertanyaan ini .

Ada kemajuan atau sedang atau berencana untuk mengimplementasikan ndmax ? Apa yang saya lakukan sekarang:

np.array([*data, None])[:-1]

# This would look a lot cleaner:
np.array(data, ndmax=1)
Apakah halaman ini membantu?
0 / 5 - 0 peringkat