kcw*_*w78 0 python field numpy append recarray
我能够将重新阵列数据复制到 ndarray,进行一些计算并返回具有更新值的 ndarray。
然后,我发现了append_fields()中的功能numpy.lib.recfunctions,并认为简单地将 2 个字段附加到我的原始重新数组来保存我的计算值会更聪明。
当我这样做时,我发现操作速度慢得多。我不需要计时,基于 ndarray 的过程需要几秒钟,而使用 recarray 需要一分钟以上,而且我的测试数组很小,<10,000 行。
这是典型的吗?ndarray 访问比 rearray 快得多?我预计由于按字段名称访问会导致性能下降,但不会那么多。
更新于 2018 年 11 月 15 日
我扩展了时序测试,以阐明 ndarray、结构化数组、recarray 和屏蔽数组(记录数组类型?)的性能差异。每一个都有细微的差别。请参阅此处的讨论:
numpy-discussion:structed-arrays-recarrays-and-record-arrays
这是我的性能测试的结果。我构建了一个非常简单的示例(使用我的 HDF5 数据集之一)来比较存储在 4 种类型的数组中的相同数据的性能:ndarray、结构化数组、recarray 和屏蔽数组。构造数组后,它们会被传递给一个函数,该函数简单地循环遍历每一行并从每一行中提取 12 个值。这些函数是timeit通过一次传递(number=1)从函数调用的。该测试仅测量数组读取功能,并避免所有其他计算。
下面给出了 9,000 行的结果:
for ndarray: 0.034137165047070615
for structured array: 0.1306827116913577
for recarray: 0.446010040784266
for masked array: 31.33269560998199
Run Code Online (Sandbox Code Playgroud)
根据此测试,每种类型的访问性能都会下降。结构化数组和 recarray 的访问时间比 ndarray 访问慢 4 倍到 13 倍(但都只有几分之一秒)。然而,ndarray 访问比屏蔽数组访问快 1000 倍。这解释了我在完整示例中看到的秒到分钟的差异。希望这些数据对遇到此问题的其他人有用。