我想使用Numpy以有效的方式收集具有相同属性的对象。我不知道在使用一个structured array或几个数组之间做出选择。
例如,让我们考虑一个对象Item
及其属性id
(4字节无符号整数),name
(20个unicode字符),price
(4字节浮点数) )。
使用结构化数组:
import numpy as np
item_dtype = np.dtype([('id', 'u4'), ('name', 'U20'), ('price', 'f4')])
# Populate:
raw_items = [(12, 'Bike', 180.54), (33, 'Helmet', 46.99)]
my_items_a = np.array(raw_items, dtype=item_dtype)
# Access:
my_items_a[0] # first item
my_items_a['price'][1] # price of second item
使用多个数组,包含在类中以便于使用:
class Items:
def __init__(self, raw_items):
n = len(raw_items)
id, name, price = zip(*raw_items)
self.id = np.array(id, dtype='u4')
self.name = np.array(name, dtype='U20')
self.price = np.array(price, dtype='f4')
# Populate:
my_items_b = Items(raw_items)
# Access:
(my_items_b.id[0], my_items_b.name[0], my_items_b.price[0]) # first item
my_items_b.price[1] # price of second item
这两种方法的优点和缺点是什么?当使用一个而不是另一个?感谢
答案 0 :(得分:1)
至少有一个考虑因素是locality of reference。
一般来说,构建内存布局是个好主意,这样当您访问某个内存位置时,您很可能会在附近访问位置。这将提高缓存性能。
因此,无论数据的逻辑含义如何:
如果您有许多操作可以计算一条记录的所有字段,然后是下一条记录的所有字段等,那么您可以考虑记录。
如果您有许多操作,您将在所有条目的单个字段上计算某些内容,那么对于所有条目等不同字段的其他内容,则您可能会考虑多个数组。
< / LI>除此之外,还有代码清晰度和易维护性的问题,因此它不是一个硬性规定。另外,一般来说,YMMV,所以你应该分析和设置不同的选项。