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

2024-03-01

我想附加两个类型的 numpy 数组np.datetime64 and int到另一个。

这会导致错误。我需要做什么来纠正这个问题?

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

麻木版本: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/user/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/user/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

可能最简单 - 与 Pandas 一起工作DataFrame而不是数组

说实话,虽然 Numpy 数组可以与异构列一起使用,但在这种情况下,它们可能不是大多数用户实际需要的。对于许多用例,您最好使用Pandas DataFrame https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html。以下是将两列转换为一列的方法DataFrame called 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对象提供了大量方法,使分析此类数据变得非常容易。请参阅熊猫文档 https://pandas.pydata.org/pandas-docs/stable/dsintro.html(或本网站上的其他 QA)了解更多信息DataFrame对象。

Numpy 唯一的解决方案 - 结构化数组

一般来说,你应该避免数组dtype=object如果可以的话。它们会导致许多基本 Numpy 运算(例如算术,例如arr0 + arr1),并且他们的行为方式可能出乎您的意料。

更好的纯 Numpy 解决方案是结构化数组。这些数组有一个复合dtype,每个字段一个部分(为了便于讨论,“字段”相当于“列”,尽管您可以用字段做更多有趣的事情 https://docs.scipy.org/doc/numpy-1.15.0/user/basics.rec.html#structured-datatype-creation)。鉴于你的a and 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

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

# works great
struct0['val'] + struct1['val']

一般来说,这些字段的行为就像标准 Numpy 数组一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将不同类型的列插入到numpy数组中? 的相关文章

随机推荐