【问题标题】:How to merge two numpy arrays of different dimensions in Python?如何在 Python 中合并两个不同维度的 numpy 数组?
【发布时间】:2019-09-19 15:03:59
【问题描述】:

Python 2.7:

尝试:

从一维 Numpy 数组中添加一个带有 datetype64(D) 的列 (arr_date) 现有的多维 Numpy 数组(数据)

出现以下错误:

  1. 'TypeError: 无效类型提升'
  2. 'numpy.AxisError:axis 1 is out of bounds for array of dimension 1'

创建的列,需要附加:

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

尝试在新 Numpy 数组 (arr_date) 中的源(数据)中提供的 3 列中创建一个日期时间对象,并使用以下方法将其添加到旧数组(数据)中:

  1. np.c_
  2. np.append
  3. np.hstack
  4. np.column_stack
  5. np.连接

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))

【问题讨论】:

  • 这些函数都使用np.concatenate,这意味着输入必须具有兼容的数据类型和兼容的形状。如果一个失败了,其他的很可能也会失败,特别是如果这是一个 dtype 问题。
  • data 是什么。它看起来像一个元组列表,除了元组之间缺少逗号。它是结构化数组吗? (3,) 是什么形状? dtype 是什么。
  • 是通过将csvgenfromtxt 类似的内容加载生成的data
  • 是的,数据是通过加载 csv 并使用模块 genfromtxt 生成的。

标签: python arrays numpy append concatenation


【解决方案1】:

在您回答我关于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 是一个具有datetime64[D] dtype 的(3,1) 数组。

===

我猜你的data 实际上是一个结构化数组,具有复合数据类型。例如:

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 时会发生错误。我敢打赌,所有其他随机尝试都会产生类似的错误(如果它们超过了轴错误)。该错误告诉我们它不能将Out[124] 中的复合数据类型与arr_datedatetime64 数据类型结合起来。 dtypes 不匹配,也无法匹配。

基本上这不是串联问题。您没有尝试将“列”添加到 2d 数组,甚至没有尝试创建 2d 数组。 data 不是二维的。它是 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

===

在我的回答中:

Add and access object-type field of a numpy structured array

我展示了如何使用来自两个数组的字段构造一个新的结构化数组,这让我们了解append_fields 正在做什么。

【讨论】:

  • 非常感谢您的解释,它帮助很大。 append_fields 上的技术页面也非常有用!
猜你喜欢
  • 1970-01-01
  • 2022-12-13
  • 2021-12-18
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
相关资源
最近更新 更多