Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Numpy中使用结构化数组而不是使用多个数组的优缺点是什么?_Python_Numpy - Fatal编程技术网

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

Python 在Numpy中使用结构化数组而不是使用多个数组的优缺点是什么?,python,numpy,Python,Numpy,我希望使用Numpy以高效的方式收集具有相同属性的对象。我不知道在使用一个或几个数组之间选择什么 例如,让我们考虑一个对象项目< /Code >及其属性 ID (4字节无符号整数),名称(20个Unicode字符),价格< /Code >(4字节浮点)。 使用结构化数组: import numpy as np item_dtype = np.dtype([('id', 'u4'), ('name', 'U20'), ('price', 'f4')]) # Populate: raw_items

我希望使用Numpy以高效的方式收集具有相同属性的对象。我不知道在使用一个或几个数组之间选择什么

例如,让我们考虑一个对象<代码>项目< /Code >及其属性<代码> ID <代码>(4字节无符号整数),<代码>名称<代码>(20个Unicode字符),<代码>价格< /Code >(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

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

至少有一点需要考虑

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

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

    >P>如果你有很多操作,你将计算一个记录的所有字段,然后计算下一个记录的所有字段等等,那么你可以考虑记录。

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

除此之外,还有代码清晰性和易维护性的问题,因此这不是一个硬性规定。此外,一般情况下,YMMV,因此您应该配置不同的选项和仪器。

一些时间测试: