-1

我有一个空的结构化数组:

id_and_orders_type = np.dtype([('id', 'i4'), ('order_values', 'f4', (100,))])
id_and_orders = np.zeros((10,), dtype=id_and_orders_type)

我有另一个结构化数组,其中包含要填充的数据id_and_orders

orders_type = np.dtype([('id', 'i4'), ('value', 'f4')])
orders = np.array(((1, 33.2), (2, 37.1), (3, 22.1), (2, 63.9), (3, 93.1)), dtype=orders_type)

我现在想做的是将每个orders['value']与其对应id的 in映射id_and_orders。以某种方式id_and_orders包含orders['id']该 id 的值的子数组orders

id_and_orders = np.array(((1, (33.2,), (2, (37.1, 63.9), (3, (22.1, 93.1)))

也许有些人会知道如何id_and_orders['order_values']动态构建子数组的大小,而不是固定大小为 100。

4

2 回答 2

0

我建议改用 Pandas DataFrame:

df=pd.DataFrame(
    [(1, 33.2), (2, 37.1), (3, 22.1), (2, 63.9), (3, 93.1)],
    columns=['type', 'value']
)
#    type  value
# 0     1   33.2
# 1     2   37.1
# 2     3   22.1
# 3     2   63.9
# 4     3   93.1

然后很容易让你分组,例如取stype的总和value

df.groupby('type').sum()
#       value
# type       
# 1      33.2
# 2     101.0
# 3     115.2
于 2018-09-14T13:00:58.157 回答
0

这是我使用 python 数据结构编写的内容,并且仅在性能成为问题时才考虑将某些数据结构转换为 numpy。 Numpy允许快速访问统一类型(和形状,用于多维数据)的项目。当数据与该格式不完全匹配时,考虑合并lists 和dicts 是个好主意。

而不是一个数组,只需使用一个列表作为输入:

id_orders = [(1, 33.2), (2, 37.1), (3, 22.1), (2, 63.9), (3, 93.1)]

然后按 id 创建一个dict订单,每个键包含属于该键的值列表。

orders = {}
for id, val in id_orders:
    orders.setdefault(id, []).append(val)

如果键存在,则使用setdefault返回键的当前值。
如果不是,则将键设置为空列表并返回。orders初始化后,将每个条目转换为numpy数组就足够简单了。最后做这一步,因为numpy数组不能很好地处理大小的变化。

orders = {k:array(v) for k, v in orders.items()} 
于 2018-09-14T14:40:05.717 回答