2 回答

TA贡献1802条经验 获得超10个赞
如果您想获得真正的矢量化处理,则需要使用诸如 numpy 之类的库。但是这些可能会限制您可以支持的数据类型,以便允许 GPU 进行处理。
在任何一种情况下,您都可以使用字典来展平结构并促进结构元素的批处理。这将是一个以元组作为键的字典,其中元组中的每个条目表示该级别的值索引:
例如:
[
[ [1,2] , [3,4,5] ],
[ [6,7,8] , [9] , [10] , [11,12] ],
[ [13] , [14,15] , [16,17,18] ]
]
可以在这样的字典中表示为:
{
(0,0,0) : 1,
(0,0,1) : 2,
(0,1,0) : 3,
(0,1,1) : 4,
(0,1,2) : 5,
(1,0,0) : 6,
(1,0,1) : 7,
(1,0,2) : 8,
(1,1,0) : 9,
(1,2,0) : 10,
(1,3,0) : 11,
(1,3,1) : 12,
(2,0,0) : 13,
(2,1,0) : 14,
(2,1,1) : 15,
(2,1,0) : 16,
(2,1,1) : 17,
(2,1,2) : 18
}
这也可以使用两个数组(一个用于级别索引,一个用于数据)在 numpy 中表示
这种类型的结构之间的处理将提供树结构中叶值的快速遍历,同时保持分支之间的关系。
例如:
# sum of values under second branch:
result = sum( value for level,value in data.items() if level[0] == 1 )
# or using numpy:
result = np.sum(data[levels[:,0]==1])
# adding two structures:
result = { k:data1.get(k,0)+data2.get(k,0) for k in set((*data1,*data2)) }
# or using numpy (assuming same levels in both structures)
resultLevels, resultData = levels1,data1+data2
# numpy adding structures with different levels is a bit more involved
# but still feasible.

TA贡献1840条经验 获得超5个赞
谢阿兰 T。
我已经使用了你的想法并编写了这个类来处理我的数据。这样,我可以像使用 numpy 数组一样使用 slice 访问我的元素,并且可以将 data 参数(扁平数据)与 numpy 矢量化函数一起使用:
class DataStructure():
__slots__ = ["data", "positions"]
def __init__(self, data, place):
self.data = np.array(data)
self.positions = np.array(place)
def __getitem__(self, item):
item = (item,) if not isinstance(item, tuple) else item
mask = np.full((len(self.positions),), True)
for i, selection in enumerate(item):
if not isinstance(selection, slice):
mask &= self.positions[:, i] == selection
else:
start, stop, step = selection.indices(len(self.positions))
mask &= np.isin(self.positions[:,i], range(start,stop,step))
return self.data[mask]
PS:不要犹豫告诉我它是否可以优化,特别是我使用切片。
添加回答
举报