【问题标题】:What are the pros and cons of using a structured array in Numpy instead of several arrays?在 Numpy 中使用结构化数组而不是多个数组的优缺点是什么?
【发布时间】:2016-01-28 21:50:29
【问题描述】:

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

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

【问题讨论】:

标签: python numpy


【解决方案1】:

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

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

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

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

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

除此之外,还有代码清晰和易于维护的问题,所以这不是一个硬性规定。此外,通常是 YMMV,因此您应该分析和检测不同的选项。

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2011-07-10
    相关资源
    最近更新 更多