Pertanyaan numpy.genfromtxt menghasilkan array dari apa yang tampak seperti tupel, bukan array 2D — mengapa?


saya sedang berlari genfromtxt seperti di bawah ini:

date_conv = lambda x: str(x).replace(":", "/")
time_conv = lambda x: str(x)

a = np.genfromtxt(input.txt, delimiter=',', skip_header=4,
      usecols=[0, 1] + radii_indices, converters={0: date_conv, 1: time_conv})

Dimana input.txt adalah dari inti ini.

Ketika saya melihat hasilnya, itu adalah array 1D bukan array 2D:

>>> np.shape(a)
(918,)

Sepertinya ini adalah array tuple sebagai gantinya:

>>> a[0]
('06/03/2006', '08:27:23', 6.4e-05, 0.000336, 0.001168, 0.002716, 0.004274, 0.004658, 0.003756, 0.002697, 0.002257, 0.002566, 0.003522, 0.004471, 0.00492, 0.005602, 0.006956, 0.008442, 0.008784, 0.006976, 0.003917, 0.001494, 0.000379, 6.4e-05)

Jika saya menghapus spesifikasi konverter dari genfromtxt sebut berfungsi dengan baik dan menghasilkan array 2D:

>>> np.shape(a)
(918, 24)

32
2018-03-02 13:51


asal


Jawaban:


Apa yang dikembalikan disebut a ndarray terstruktur, lihat misalnya di sini: http://docs.scipy.org/doc/numpy/user/basics.rec.html. Ini karena data Anda tidak homogen, yaitu tidak semua elemen memiliki jenis yang sama: data berisi string (dua kolom pertama) dan pelampung. Numpy array harus homogen (lihat sini untuk penjelasan).

Array terstruktur 'menyelesaikan' kendala homogenitas ini dengan menggunakan tupel untuk setiap record atau baris, itulah alasan array yang dikembalikan adalah 1D: satu rangkaian tupel, tetapi setiap tupel (baris) terdiri dari beberapa data, sehingga Anda dapat menganggapnya sebagai baris dan kolom. Kolom yang berbeda dapat diakses sebagai a['nameofcolumn'], dalam kasus Anda misalnya a['Julian_Day'].

Alasannya mengembalikan array 2D saat menghapus konverter untuk dua kolom pertama adalah bahwa itu kasus itu, genfromtxt salam semua data dari jenis yang sama, dan ndarray normal dikembalikan (tipe default mengambang, tetapi Anda dapat menentukan ini dengan dtype argumen).

EDIT: Jika Anda ingin menggunakan nama kolom, Anda dapat menggunakan names argumen (dan mengatur skip_header hanya tiga):

a2 = np.genfromtxt("input.txt", delimiter=',', skip_header=3, names = True, dtype = None,
                  usecols=[0, 1] + radii_indices, converters={0: date_conv, 1: time_conv})

yang dapat Anda lakukan misalnya:

>>> a2['Dateddmmyyyy']
array(['06/03/2006', '06/03/2006', '18/03/2006', '19/03/2006',
       '19/03/2006', '19/03/2006', '19/03/2006', '19/03/2006',
       '19/03/2006', '19/03/2006'], 
      dtype='|S10')

43
2018-03-02 14:10