是什么使用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 

什么是这两种方法的优点和缺点?当使用一个而不是另一个?由于

+1

一些时间测试:http://*.com/q/34933105 – hpaulj

至少有一个考虑是,locality of reference

一般情况下,这是一个好主意,结构内存布局,这样当你访问某些内存位置,有一个很好的机会,你会通过右键近访问的地点。这会增加缓存性能。

因此,不管数据的逻辑含义:

  • 如果你有很多的操作,你将计算的东西在一个记录的各个领域,那么下一条记录的所有字段等那么你可能会考虑记录。

  • 如果你有很多操作,你可以在单个字段上计算所有条目的内容,然后为所有条目的其他字段计算其他值,那么你可以考虑使用几个数组。

除此之外,还有代码的清晰性和易于维护的问题,所以它不是一个硬性规则和快速规则。此外,一般来说,YMMV,所以你应该配置和仪器不同的选项。