python 如何用numpy创建复杂的mulit分区数组

kpbpu008  于 2023-04-28  发布在  Python
关注(0)|答案(1)|浏览(111)

我有一个包含96个价格值的数组,叫做price_array,并希望有一个4维数组,每个dimensions具有以下特征:
1.第一维量化了price_array应该具有的分区的数量。第一个条目只是意味着,整个数组只是被视为一个整体。对于第二个条目意味着price_array被划分为2个部分,第三个条目意味着price_array被划分为3个部分。这里应该有4个条目
1.第二维精确定位来自price_array的数据的特定分区。这里,来自维度1的每个条目也应该有4个条目。第一个条目(对于维度1的每个条目)应该指定它引用的分区的哪一部分。对于第一维度的条目1,仅存在包括所有值的1个分区。因此,在这里,该维度(第二维)的其他条目应该具有值-1。对于第一维度的第二个条目,在该维度中应该有2个分区。该维度的第一个条目包含价格的前半部分,而该维度的第二个条目包含价格的后半部分。对于第一维度的第3个条目,应该有3个分区等。
1.在第三维中,应该有5个条目。每个条目指定分区从第二维度起的第1、第2、第3、第4和第5最高k值。
1.第四维度实际上包含由第三维度的值指定的k个highes值。

ymdaylpp

ymdaylpp1#

一个numpy数组在这里似乎并不合适。
这里有一个替代方案:

import numpy as np
from collections import namedtuple

KMax = namedtuple("KMax", ["indices", "values"])

N = 96
K = 5
num_partitions = [1, 2, 3, 4]

prices = np.random.randint(0, 500, size=N)

partitions_infos = {}
for num_parts in num_partitions:
    arr = prices.reshape(num_parts, -1)

    idxs_maxs = np.argsort(arr, axis=1)[:, -K:]
    vals_maxs = np.take_along_axis(arr, idxs_maxs, axis=1)

    partitions_infos[num_parts] = KMax(indices=idxs_maxs, values=vals_maxs)
>>> partitions_infos[3].indices  # equivalent to partitions_infos[3][0]
array([[18, 21, 13, 20, 12],
       [25,  5,  6, 17, 13],
       [20, 26, 23, 11, 12]])
>>> partitions_infos[3].values  # equivalent to partitions_infos[3][1]
array([[448, 479, 479, 479, 498],
       [464, 481, 486, 490, 490],
       [462, 472, 477, 479, 487]])

相关问题