是什么使用numpy的结构化阵列的优点和缺点,而不是在多个阵列的?
问题描述:
我想用numpy的收集具有相同属性的对象的有效途径。我不知道该怎么使用一个structured array或多个阵列之间进行选择。是什么使用numpy的结构化阵列的优点和缺点,而不是在多个阵列的?
例如,让我们考虑一个目的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
什么是这两种方法的优点和缺点?当使用一个而不是另一个?由于
答
至少有一个考虑是,locality of reference。
一般情况下,这是一个好主意,结构内存布局,这样当你访问某些内存位置,有一个很好的机会,你会通过右键近访问的地点。这会增加缓存性能。
因此,不管数据的逻辑含义:
如果你有很多的操作,你将计算的东西在一个记录的各个领域,那么下一条记录的所有字段等那么你可能会考虑记录。
如果你有很多操作,你可以在单个字段上计算所有条目的内容,然后为所有条目的其他字段计算其他值,那么你可以考虑使用几个数组。
除此之外,还有代码的清晰性和易于维护的问题,所以它不是一个硬性规则和快速规则。此外,一般来说,YMMV,所以你应该配置和仪器不同的选项。
一些时间测试:http://*.com/q/34933105 – hpaulj