【发布时间】:2015-06-30 04:53:36
【问题描述】:
我正在使用 numpy 和以下数据(所有矩阵的所有单元格都不是负数):
>>> X1.shape
(59022, 16)
>>> X3.shape
(59022, 84122)
>>> ind.shape
(59022,)
>>> np.max( ind )
59021
>>> np.min( ind )
0
>>> len( set ( ind.tolist() ) )
59022
简而言之,ind 只是一种在任一矩阵中重新排列行的方法。问题是,虽然重新排列较小数组 (X1) 中的行可以按需要工作,但对较大数组 (X2) 的相同操作会导致某个点以下的所有行都为零。这是我的工作:
>>> np.nonzero( np.sum( X3, axis=1 ) )[0].shape
(59022,)
现在让我们看看如果重新排列行会发生什么:
>>> np.nonzero( np.sum( X3[ ind, : ], axis=1 ) )[0].shape
(7966,)
但对于较小的矩阵,一切正常:
>>> np.nonzero( np.sum( X1, axis=1 ) )[0].shape
(59022,)
>>> np.nonzero( np.sum( X1[ ind, : ], axis=1 ) )[0].shape
(59022,)
我猜我可以尝试的一件事是使用稀疏矩阵,但我只是想知道我是否可以让这件事发挥作用。我有 256GB 的 RAM,所以我不认为内存是一个限制。感谢您的提示!
【问题讨论】:
-
你的数组是什么 dtypes (
print X3.dtype)?您使用的是什么版本的 numpy (print np.__version__)?84122 * 7966略低于2**30,对我来说,这听起来像是在 64 位系统中使用的 32 位指针/索引。您应该在 numpy github 问题中报告此问题,here。 -
我无法检查您的 X3 尺寸,但您是否尝试过使用
operator.itemgetter?from operator import itemgetter; mygetter = itemgetter(*ind); np.allclose(mygetter(X1), X1[ ind, : ])为随机非负X1返回True。也许 Numpy 和itemgetter都在底层使用相同的方法来重新排列数组,但也许不是,itemgetter可能有效? -
可能修复是升级你的numpy版本,你用什么?