python - 如何在 Python 中合并两个不同维度的 numpy 数组?
问题描述
蟒蛇 2.7:
试图:
将一维 Numpy 数组中具有 datetype64(D) 的列 (arr_date) 添加 到现有的多维 Numpy 数组 (data)
引发以下错误:
- 'TypeError:无效的类型提升'
- 'numpy.AxisError:轴 1 超出维度 1 数组的范围'
创建的列,需要附加:
>> arr_date
<<
[['2019-04-21']
['2019-04-21']
['2019-04-21']]
尝试在新 Numpy 数组 (arr_date) 中的源 (数据) 中提供的 3 列中创建一个日期时间对象,并使用以下方法将其添加到旧数组 (数据) 中:
- np.c_
- np.追加
- np.hstack
- np.column_stack
- 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))
解决方案
在您回答我关于 的问题之前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
具有 dtype 的 (3,1) 数组也是如此datetime64[D]
。
===
我猜你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]
与. 不匹配,也无法匹配。datetime64
arr_date
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
.
===
在我的回答中:
我展示了如何使用来自两个数组的字段来构造一个新的结构化数组,从而了解append_fields
正在做什么。
推荐阅读
- c# - 通信 Windows 服务/Web 服务器
- angular - 如何在 Angular 中将组件传递给 ng-content?
- arrays - 如何在 PostgreSQL 选择语句中尊重数组的顺序
- python - 在 wagtail django 中搜索模型时的问题
- r - 如何将标签的特定标题中的任何内容保留到下一个相同的标签
- angular - 在辅助插座之间传递参数
- c# - 相当于 C# 中的#define number 4
- javascript - 如何通过单击动态侧栏中的子菜单打开新页面
- youtube-api - YouTube API:如何通过频道名称获取频道 ID?
- apache-curator - 疯狂的连续错误:[Socket error occurred: xxx: Network is unreachable] 当网络不可用时