Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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_Data Structures - Fatal编程技术网

Python “NumPy”;“记录数组”;或;“结构化阵列”;或;“重新安排”;

Python “NumPy”;“记录数组”;或;“结构化阵列”;或;“重新安排”;,python,numpy,data-structures,Python,Numpy,Data Structures,如果有的话,NumPy“结构化数组”、“记录数组”和“重新数组”之间有什么区别 这意味着前两个是相同的:如果是,这个对象的首选术语是什么 相同的文档说明(在页面底部): 您可以找到有关重新阵列和结构化阵列的更多信息(包括两者之间的区别)。这种差异有简单的解释吗?记录/重新排列在 此文件中的一些相关引用 记录数组 记录数组将结构化数组的字段作为属性公开。 重新阵列几乎与标准阵列(支持 已命名字段)最大的区别在于它可以使用 属性查找以查找字段,并使用 记录 recarray是ndarray的一个子

如果有的话,NumPy“结构化数组”、“记录数组”和“重新数组”之间有什么区别

这意味着前两个是相同的:如果是,这个对象的首选术语是什么

相同的文档说明(在页面底部):
您可以找到有关重新阵列和结构化阵列的更多信息(包括两者之间的区别)。这种差异有简单的解释吗?

记录/重新排列在

此文件中的一些相关引用

记录数组 记录数组将结构化数组的字段作为属性公开。 重新阵列几乎与标准阵列(支持 已命名字段)最大的区别在于它可以使用 属性查找以查找字段,并使用 记录

recarray
ndarray
的一个子类(与
matrix
屏蔽数组的方式相同)。但请注意,它的构造函数不同于
np.array
。它更像是
np.empty(size,dtype)

将唯一字段实现为属性行为的关键函数是
\uuuu getattribute\uuuuu
\uuuu getitem\uuuuu
实现索引):

它首先尝试获取一个常规属性,比如
.shape
.strips
.data
,以及所有方法(
.sum
.restrape
,等等)。否则,它将在
dtype
字段名称中查找名称。因此,它实际上只是一个具有一些重新定义的访问方法的结构化数组

据我所知,
record array
recarray
是相同的

另一个文件显示了一些历史记录

用于操作结构化数组的实用程序集合。 这些函数中的大多数最初是由John Hunter为 matplotlib。为了方便起见,它们已被改写和扩展

此文件中的许多函数以以下内容结尾:

    if asrecarray:
        output = output.view(recarray)
您可以将数组返回为
recarray
视图,这一事实表明该层有多薄


numpy
历史悠久,合并了多个独立项目。我的印象是,
recarray
是一个较老的想法,而结构化数组是基于广义的
dtype
的当前实现<代码>重新排列
似乎比任何新开发都更方便和向后兼容。但是我必须研究
github
文件历史记录,以及任何最近的问题/请求才能确定。

简而言之,答案是您通常应该使用结构化数组而不是重新数组,因为结构化数组速度更快,重新数组的唯一优势是允许您编写
arr.x
而不是
arr['x']
,这可能是一个方便的快捷方式,但如果列名与numpy方法/属性冲突,则也容易出错

有关更详细的解释,请参见@jakevdp的书。特别是,他指出,简单地访问结构化数组的列可以比访问重新排列的列快20到30倍。然而,他的示例使用一个只有4行的非常小的数据帧,并且不执行任何标准操作

对于较大数据帧上的简单操作,差异可能会小得多,尽管结构化阵列速度更快。例如,这里有一个结构化和记录数组,每个数组有10000行(从@jpp answer借用的数据帧创建数组的代码)

如果我们执行一个标准操作,例如将一列乘以2,结构化数组的速度将提高约50%:

%timeit struct_array['x'] * 2
9.18 µs ± 88.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit rec_array.x * 2
14.2 µs ± 314 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

“我已经澄清了这个问题,@Ashwini Chaudhary-谢谢。关于文件上的差异的解释有什么不清楚的?recarray支持访问
arr.foo
格式的字段,而普通结构化数组只支持通过
arr['foo']
格式访问,但查找速度更快。我绝不会将“结构化数组”称为“记录数组”,因为它会导致与“重新数组”的潜在混淆。例如,这两种记录数组的历史是什么?它们是完全不同的实现还是共享底层代码?为什么给定属性访问开销,我想使用重新排列?这里是Noob。。。。对于我来说,当您希望从具有多个字段/列的阵列中访问数据时,重新阵列允许更高级别的灵活性。可以通过my_array['DataField']或数组点域表示法my_array.DataField进行访问。我发现这是一个额外的好处,是对数组的一个提升,在数组中,你必须依靠使用数字按字段位置进行切片,因为我永远记不起它们在哪一列。关于绩效差距问题的可靠陈述。也就是说,它确实存在,您可能应该关心一下。当我使用dtype=list(zip(s.index,s))时,我会为所有列获取一个dtype对象的np数组。是否有办法从pd.DataFrame进行转换,使np.array保留原始列的数据类型(例如字符串、整数和浮点?),而不是将它们全部设置为对象?@Spcoggthesecond我不确定我是否遵循。。。通过上面的代码,我得到struct_arr和rec_数组的x为float,y为int。如果您不是,我不知道为什么,但是常规numpy数组有一个用于数据类型转换的
astype
方法,您还可以在这里看到rec数组的类型转换:
    if asrecarray:
        output = output.view(recarray)
n = 10_000
df = pd.DataFrame({ 'x':np.random.randn(n) })
df['y'] = df.x.astype(int)

rec_array = df.to_records(index=False)

s = df.dtypes
struct_array = np.array([tuple(x) for x in df.values], dtype=list(zip(s.index, s)))
%timeit struct_array['x'] * 2
9.18 µs ± 88.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit rec_array.x * 2
14.2 µs ± 314 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)