在Numpy中使用结构化数组而不是几个数组有什么优缺点?

时间:2016-01-28 13:44:33

标签: python numpy

我想使用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

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

1 个答案:

答案 0 :(得分:1)

至少有一个考虑因素是locality of reference

一般来说,构建内存布局是个好主意,这样当您访问某个内存位置时,您很可能会在附近访问位置。这将提高缓存性能。

因此,无论数据的逻辑含义如何:

  • 如果您有许多操作可以计算一条记录的所有字段,然后是下一条记录的所有字段等,那么您可以考虑记录。

  • 如果您有许多操作,您将在所有条目的单个字段上计算某些内容,那么对于所有条目等不同字段的其他内容,则您可能会考虑多个数组。

    < / LI>

除此之外,还有代码清晰度和易维护性的问题,因此它不是一个硬性规定。另外,一般来说,YMMV,所以你应该分析和设置不同的选项。