我想将两个np.datetime64
和int
类型的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
答案 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,“字段”也等效于“列”)。给定您的dtype
和a
数组,以下是创建结构化数组的方法:
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)