Как объединить два пустых массива разных измерений в Python? - PullRequest
0 голосов
/ 01 мая 2019

Python 2.7:

При попытке:

добавить столбец (arr_date) с датой type64 (D) из 1 измерения Массив Numpy в существующий многомерныйNumpy array (data)

Возникают следующие ошибки:

  1. 'TypeError: недопустимое продвижение типа'
  2. 'numpy.AxisError: ось 1 выходит за пределыдля массива измерения 1 '

Создан столбец, который требуется добавить:

>> arr_date
<<     
[['2019-04-21']
 ['2019-04-21']
 ['2019-04-21']]

Попытка создать объект datetime из 3 столбцов, предоставленных в источнике (data) в новом массиве Numpy (arr_date) и добавьте его в старый массив (data), используя следующие методы:

  1. np.c_
  2. np.append
  3. np.hstack
  4. np.column_stack
  5. np.concatenate

data = [(2019, 4, 21, 4.9, -16.5447, -177.1961,  22.4, 'US')
(2019, 4, 21, 4.8,  -9.5526,  109.6003,  10. , 'UK')
(2019, 4, 21, 4.6,  -7.2737,  124.0192, 554.9, 'FR')]

arr_date = np.zeros((len(data),1), dtype='datetime64[D]')

i = 0

while i < len(data):    
        date = dt.date(data [i][0], data[i][1], data[i][2])     
        arr_date[i][0] = date    
        i += 1    


test1 = np.column_stack((data,arr_date))

np.c_[data, np.zeros(len(data))]

test2 = np.concatenate(data.reshape(-1,1), arr_date.reshape(-1,1), axis=1)

np.append(data, arr_date, axis = 1)

np.stack((data, arr_date), axis=-1)

np.hstack((data, arr_date))

test3 = np.column_stack((data, arr_date))

1 Ответ

1 голос
/ 01 мая 2019

Пока вы не ответите на мой вопрос о data.dtype, я собираюсь добавить запятые и составить data список кортежей:

In [117]: data = [(2019, 4, 21, 4.9, -16.5447, -177.1961,  22.4, 'US'), 
     ...: (2019, 4, 21, 4.8,  -9.5526,  109.6003,  10. , 'UK'), 
     ...: (2019, 4, 21, 4.6,  -7.2737,  124.0192, 554.9, 'FR')]                      

In [118]: arr_date = np.zeros((len(data),1), dtype='datetime64[D]') 
     ...:  
     ...: i = 0 
     ...:  
     ...: while i < len(data):     
     ...:         date = dt.date(data [i][0], data[i][1], data[i][2])      
     ...:         arr_date[i][0] = date     
     ...:         i += 1     
     ...:                                                                            

In [119]: arr_date                                                                   
Out[119]: 
array([['2019-04-21'],
       ['2019-04-21'],
       ['2019-04-21']], dtype='datetime64[D]')

То есть arr_date - это массив (3,1) с datetime64[D] dtype.

===

Я предполагаю, что ваш data на самом деле является структурированным массивом с составным типом d. Например:

In [121]: data1 = np.array(data, dtype='i,i,i,f,f,f,f,U2')                           

In [122]: data1                                                                      
Out[122]: 
array([(2019, 4, 21, 4.9, -16.5447, -177.1961,  22.4, 'US'),
       (2019, 4, 21, 4.8,  -9.5526,  109.6003,  10. , 'UK'),
       (2019, 4, 21, 4.6,  -7.2737,  124.0192, 554.9, 'FR')],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f4', '<f4'), ('f5', '<f4'), ('f6', '<f4'), ('f7', '<U2')])

In [123]: data1.shape                                                                
Out[123]: (3,)

In [124]: data1.dtype                                                                
Out[124]: dtype([('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f4', '<f4'), ('f5', '<f4'), ('f6', '<f4'), ('f7', '<U2')])

Ваша итерация date работает с этим. Но поля (не столбцы) data1 могут быть доступны по имени:

In [127]: data1['f0']                                                                
Out[127]: array([2019, 2019, 2019], dtype=int32)

column_stack может объединить массив (3,) с (3,1) для получения (3,2), но:

In [130]: np.column_stack((data, arr_date))                                          
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-130-5c8e6a103474> in <module>
----> 1 np.column_stack((data, arr_date))

/usr/local/lib/python3.6/dist-packages/numpy/lib/shape_base.py in column_stack(tup)
    638             arr = array(arr, copy=False, subok=True, ndmin=2).T
    639         arrays.append(arr)
--> 640     return _nx.concatenate(arrays, 1)

TypeError: invalid type promotion

Первое замечание, что ошибка возникает при попытке сделать concatenate. Бьюсь об заклад, все другие случайные попытки дали аналогичную ошибку (если они прошли ошибку оси). Ошибка говорит нам, что он не может объединить составной dtype, как в Out[124], с datetime64 dtype arr_date. dtypes не совпадают и не могут быть сопоставлены.

По сути, это не проблема конкатенации. Вы не пытаетесь добавить «столбец» в 2d массив или даже не пытаетесь создать 2d массив. data не 2d. Это 1d. Что вам нужно сделать, это добавить поле в структурированный массив.

Имеется модуль функций, упрощающий работу со структурированными массивами.

In [131]: import numpy.lib.recfunctions as rf 

append_fields должен сделать трюк, но это может быть немного сложно использовать:

In [137]: rf.append_fields(data1, 'date', arr_date.ravel(), usemask=False)           
Out[137]: 
array([(2019, 4, 21, 4.9, -16.5447, -177.1961,  22.4, 'US', '2019-04-21'),
       (2019, 4, 21, 4.8,  -9.5526,  109.6003,  10. , 'UK', '2019-04-21'),
       (2019, 4, 21, 4.6,  -7.2737,  124.0192, 554.9, 'FR', '2019-04-21')],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f4', '<f4'), ('f5', '<f4'), ('f6', '<f4'), ('f7', '<U2'), ('date', '<M8[D]')])

Это все еще одномерный массив, но с еще одним полем, которое я назвал date.

===

В моем ответе:

Добавить и получить доступ к полю типа объекта для простого структурного массива

Я показываю, как построить новый структурированный массив с полями из двух массивов, что дает представление о том, что делает append_fields.

...