基于一列的值在numpy中提取子数组的有效方法

时间:2016-02-25 13:52:14

标签: python arrays numpy

简短版本: 我正在寻找一种有效的方法:

my_data = big_data[big_data[:, 1] == p_num, 2:]

长版: 我正在处理非常大的文件。 首先,我将其中一个读成一个numpy数组“数据” 然后我想使用多处理,以避免多次交流, 我使用了多处理.Array:

data_shared = Array(ctypes.c_double, data.size)
big_data = np.frombuffer(data_shared.get_obj())
big_data = data

稍后,我有一个函数,所有进程都执行以提取感兴趣的数据:

def extract(p_num):
    global big_data

    my_data = big_data[big_data[:, 1] == p_num, 2:]
    return my_data

之后我在my_data上进行了大量的计算,其中一部分是在fortran中使用f2py,所以我真的需要提取这些数据,并且不能使用掩码或类似的东西。

问题是这个提取函数很长。

我尝试使用f2py或cython但没有成功,所以我问你。

2 个答案:

答案 0 :(得分:0)

在Python中处理非常大的数据集时,我已经使用HDF5(例如h5py或pytables)与numpy / scipy结合使用。因此,我建议采用以下方法。

  • 以HDF5格式存储数据,然后加载它们可能会更快,您可以在加载数据时对数据进行切片。注意如何构造HDF5文件,因为这会影响性能(特别是如果它被压缩)。
  • 加载数据后,请注意在numpy / scipy中对事物进行矢量化,因为矢量化函数通常非常有效。 (但你可能已经知道了。)
  • 如果您正在执行大量线性代数,那么在numpy / scipy中切换到更高效的BLAS / LAPACK实现可能有所帮助(例如MKL)。

最后,如果代码仍然计算效率低下,您可能需要重新设计 - 或切换到C或其他高效的编译语言。

答案 1 :(得分:0)

最后,我通过在fortran中重新排序我的大数组来解决我的问题。 所以现在我:

  • 阅读文件
  • 计算大数组中的p_num数量(在fortran中,但不确定它是否重要)
  • 重新排序我的数组,添加由p_num(在fortran中)
  • 给出的维度

在我的情况下,此解决方案效率更高。