如何将不同类型的列插入numpy数组?

时间:2019-01-20 16:50:02

标签: python numpy

我想将两个np.datetime64int类型的numpy数组追加到另一个数组。

这会导致错误。我该怎么做才能纠正这个问题?

如果我将向量附加到自身上(即:np.append(c,c,axis=1)np.append(a,a,axis=1)),它将正常工作

numpy版本:1.14.3

import numpy as np
a = np.array([['2018-04-01T15:30:00'],
              ['2018-04-01T15:31:00'],
              ['2018-04-01T15:32:00'],
              ['2018-04-01T15:33:00'],
              ['2018-04-01T15:34:00']], dtype='datetime64[s]')
c = np.array([0,1,2,3,4]).reshape(-1,1)
c
Out[2]: 
array([[0],
       [1],
       [2],
       [3],
       [4]])
d = np.append(c,a,axis=1)
Traceback (most recent call last):
  File "/home/claudia/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2963, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-3-10548a83d1a2>", line 1, in <module>
    d = np.append(c,a,axis=1)
  File "/home/claudia/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py", line 5166, in append
    return concatenate((arr, values), axis=axis)
TypeError: invalid type promotion

2 个答案:

答案 0 :(得分:2)

可能最简单-使用熊猫DataFrame而不是数组

说实话,虽然可以使Numpy数组与异类列一起使用,但在这种情况下,它们可能并不是大多数用户实际需要的。在许多情况下,使用Pandas DataFrame可能会更好。将两列转换为名为DataFrame的{​​{1}}的方法如下:

df

然后您可以像这样处理每个列:

import numpy as np
import pandas as pd

a = np.array([['2018-04-01T15:30:00'],
              ['2018-04-01T15:31:00'],
              ['2018-04-01T15:32:00'],
              ['2018-04-01T15:33:00'],
              ['2018-04-01T15:34:00']], dtype='datetime64[s]')
c = np.array([0,1,2,3,4]).reshape(-1,1)


df = pd.DataFrame(dict(date=a.ravel(), val=c.ravel()))
print(df)
# output:
#                      date  val
#     0 2018-04-01 15:30:00    0
#     1 2018-04-01 15:31:00    1
#     2 2018-04-01 15:32:00    2
#     3 2018-04-01 15:33:00    3
#     4 2018-04-01 15:34:00    4

print(df['date']) # output: # 0 2018-04-01 15:30:00 # 1 2018-04-01 15:31:00 # 2 2018-04-01 15:32:00 # 3 2018-04-01 15:33:00 # 4 2018-04-01 15:34:00 # Name: date, dtype: datetime64[ns] 对象提供了大量的方法,使分析此类数据非常容易。有关DataFrame对象的更多信息,请参见Pandas docs(或此网站上的其他QA)。

仅适用于数字的解决方案-结构化数组

通常,如果可以的话,应避免使用DataFrame数组。它们会导致许多基本的Numpy操作(例如算术,例如dtype=object)出现性能问题,并且它们可能会以您意想不到的方式运行。

更好的仅Numpy解决方案是结构化数组。这些数组有一个复合arr0 + arr1,每个字段有一个部分(为了便于讨论,尽管您can do more interesting things with fields,“字段”也等效于“列”)。给定您的dtypea数组,以下是创建结构化数组的方法:

c

然后,您可以通过使用特定列的名称对其进行索引来访问特定列(就像使用# create the compound dtype dtype = np.dtype(dict(names=['date', 'val'], formats=[arr.dtype for arr in (a, c)])) # create an empty structured array struct = np.empty(a.shape[0], dtype=dtype) # populate the structured array with the data from your column arrays struct['date'], struct['val'] = a.T, c.T print(struct) # output: # array([('2018-04-01T15:30:00', 0), ('2018-04-01T15:31:00', 1), # ('2018-04-01T15:32:00', 2), ('2018-04-01T15:33:00', 3), # ('2018-04-01T15:34:00', 4)], # dtype=[('date', '<M8[s]'), ('val', '<i8')]) 一样):

DataFrame

结构化数组陷阱

例如,您不能添加两个结构化数组:

print(struct['date'])
# output:
#     ['2018-04-01T15:30:00' '2018-04-01T15:31:00' '2018-04-01T15:32:00'
#      '2018-04-01T15:33:00' '2018-04-01T15:34:00']

但是您可以添加两个结构化数组的字段:

# doesn't work
struct0 + struct1

通常,这些字段的行为就像标准的Numpy数组一样。

答案 1 :(得分:0)

考虑到其他用户的陈述,可以得出以下见解:将第一个数组转换为dtype object至少是一种解决方法。

import numpy as np
a = np.array([['2018-04-01T15:30:00'],
       ['2018-04-01T15:31:00'],
       ['2018-04-01T15:32:00'],
       ['2018-04-01T15:33:00'],
       ['2018-04-01T15:34:00']], dtype='datetime64[s]')
a = a.astype("object")
c = np.array([0,1,2,3,4]).reshape(-1,1)
d = np.append(a,c,axis=1)
d

array([[datetime.datetime(2018, 4, 1, 15, 30), 0],
   [datetime.datetime(2018, 4, 1, 15, 31), 1],
   [datetime.datetime(2018, 4, 1, 15, 32), 2],
   [datetime.datetime(2018, 4, 1, 15, 33), 3],
   [datetime.datetime(2018, 4, 1, 15, 34), 4]], dtype=object)