当前位置: 首页 > 面试题库 >

使用大型Numpy阵列的技术?

颛孙智勇
2023-03-14
问题内容

有时,您必须对一个或多个大型Numpy阵列执行许多中间操作。这会很快导致MemoryErrors。在我到目前为止的研究中,U发现酸洗(Pickle,CPickle,Pytables等)gc.collect()是缓解此问题的方法。我想知道经验丰富的程序员在处理大量数据时是否还会使用其他任何技术(当然,除了消除策略/代码中的冗余之外)。

另外,如果我确定有一件事,那就是没有免费的东西。使用其中一些技术,需要进行哪些权衡(例如,速度,鲁棒性等)?


问题答案:

我感到很痛苦…您有时最终会在数组值中存储几倍的大小,然后将其丢弃。一次处理数组中的一项时,这无关紧要,但是在向量化时可能会杀死您。

我将使用工作示例进行说明。我最近使用numpy对此处描述的算法进行了编码。这是一种颜色映射算法,它获取RGB图像并将其转换为CMYK图像。对于每个像素重复此过程,如下所示:

  1. 使用每个RGB值的最高4位作为三维查找表的索引。这将确定LUT中多维数据集的8个顶点的CMYK值。
  2. 根据上一步的顶点值,使用每个RGB值的最低有效4位在该多维数据集中进行插值。最有效的方法是计算16个uint8数组,其大小为要处理图像的大小。对于24位RGB图像,相当于需要存储x6倍的图像来进行处理。

您可以执行以下几项操作:

1.分而治之

也许您不能单次处理1,000x1,000的数组。但是,如果您可以使用python循环遍历10个100x1,000的数组来完成此操作,那么它仍然可以远远超过1,000,000个项目的python迭代器!是的,它会比较慢,但是不会那么快。

2.缓存昂贵的计算

这与我上面的插值示例直接相关,尽管值得关注,但很难理解。因为我要在每个维度上具有4位的三维多维数据集上进行插值,所以只有16x16x16的可能结果,可以将结果存储在16个16x16x16字节的数组中。因此,我可以对其进行预计算并使用64KB的内存进行存储,然后针对整个图像逐一查找这些值,而不用为每个像素重做相同的操作而付出巨大的内存成本。对于小至64x64像素的图像,这已经是值得的,并且基本上可以处理像素数x
6倍的图像,而不必细分数组。

3.dtypes明智地使用

如果您的中间值可以放在一个中uint8,请不要使用int32s数组!由于无提示的溢出,这可能会变成神秘错误的噩梦,但是如果您小心一点,它可以节省大量资源。



 类似资料:
  • 问题内容: NumPy是一个非常有用的库,通过使用它,我发现它能够轻松处理非常大的矩阵(10000 x 10000),但是开始处理任何更大的矩阵(尝试创建50000 x 50000的矩阵)失败)。显然,这是因为需要大量内存。 是否有一种方法可以以某种方式(没有几个terrabytes的RAM)在NumPy中本地创建大型矩阵(比如说一百万乘一百万)? 问题答案: PyTables和NumPy是必经之

  • 我有一个数组,我想屏蔽它,这样我就可以保持它的形状,即,不删除屏蔽的元素。 例如在此代码中 打印输入是对未屏蔽元素进行上述数学运算的结果,并返回一个没有屏蔽元素的1D数组。

  • 因此,我有两个大小相等的2D numpy数组,都是在两个不同的曲面上使用方法获得的。 数组中的每个值也是形式的数组(所以我基本上有一个带有1D元素的2D数组)。 基本上,我想根据条件对两者进行比较: 有没有更有效的方法可以做到这一点,而无需简单地迭代任何一个数组,如下所示?

  • 包含5911个时间戳 包含5911个样本,每个样本具有20个mfcc特征。 因此,如果您查看 ,它将如下所示: (5911,) (5911, 20) 我想将这两者结合起来,以便: 在R中,我可以简单地 我如何在python中实现这一点? 因此最终数据如下所示: 其中,这些时间1到时间5911只是所需的\u time\u标记中包含的值 我试过: 但出现了这个错误 然后我尝试转置: 但同样的错误: 我

  • 我有一个线性方程组,如MX=N。M是一个21x21矩阵,其中许多元素为零。当我试图用X=np求解这个系统时。linalg。求解(M,N),它会产生以下错误: 这里的问题是返回的值是0.0。我尝试了两种不同的方法来生成矩阵,这时我遇到了一个奇怪的行为: i) M的非零元素在代码中的其他地方计算。所有这些元素都是浮点数,表示为m_1,m_2,m_21。首先,为了生成M,我尝试了以下代码: 该矩阵的行列

  • 我目前有以下问题,给定一个数组,为了简单起见,假设一个4 x 4数组(我实际上正在使用512 x 512) 我想在数组周围循环/滑动,这样我就可以在表单中保存新数组 < code>np.array([3,5],[7,6]),np.array([2,4],[8,8]),np.array([1,6],[2,1]),np.array ([7,7],[1,4])等等(理想情况下,我可以选择我的“滑动”窗口