Python 索引以numpy格式共享行数据

Python 索引以numpy格式共享行数据,python,arrays,numpy,Python,Arrays,Numpy,我使用的是一个非常密集(比如20-50%)但具有相同值的大区域的numpy数组。例如,我可能有一个类似以下内容的数组: [[0 0 0 0] [1 2 3 4] [0 0 0 0] [3 4 5 6]] 有没有办法共享行内存,使行0和行2都访问相同的内存,而不是将填充了相同值(0行)的行作为单独的行存储在内存中?我正在寻找的东西,要么内置在numpy中,要么允许正常的numpy函数与这样的数组一起工作。我需要它看起来像我仍然在使用numpy数组 请注意: 我知道我可以在python中创建

我使用的是一个非常密集(比如20-50%)但具有相同值的大区域的numpy数组。例如,我可能有一个类似以下内容的数组:

[[0 0 0 0]
 [1 2 3 4]
 [0 0 0 0]
 [3 4 5 6]]
有没有办法共享行内存,使行0和行2都访问相同的内存,而不是将填充了相同值(0行)的行作为单独的行存储在内存中?我正在寻找的东西,要么内置在numpy中,要么允许正常的numpy函数与这样的数组一起工作。我需要它看起来像我仍然在使用numpy数组

请注意:

我知道我可以在python中创建一个对象,将输入索引映射到某个numpy数组中的数据索引,但我也希望这个对象被视为numpy数组,这样我就可以在其上调用numpy函数


我以前见过稀疏矩阵,但我的数据并不是那么稀疏,所以在我看来,稀疏矩阵算法的效率不高。

不可能。您可以使用实现的类处理一些NumPy函数,但它只处理ufuncs。您必须自己实现索引,对于NumPy的其余大部分内容,您最多只能使用隐式将对象转换为真实密集数组的选项


scipy.sparse
sparse矩阵最接近内置选项,但即使如此,sparse矩阵也与大多数NumPy函数不兼容。

如果您只是想节省内存,可能玩dtype会有所帮助。我不知道,是快还是慢

from sys import getsizeof
>>> arr2 = np.ones((1000,1000))
>>> getsizeof(arr2)
8000112
>>> arr2 = np.ones((1000,1000),dtype='>i2')
>>> getsizeof(arr2)
2000112

但是如果你想用浮点数进行计算,你也可以尝试使用dtype='single',以防不需要高精度。

我不认为你所要求的是可能的或值得的,但也许有人会让我们惊讶,你在找这个吗?如果整个阵列都有重复模式,则可以使用一些跨步技巧来避免“复制”。但如果阵列不规则,则不会。阵列的数据存储在平面(1d)缓冲区中。正是跨步和形状使它成为多维的。@timgeb我上面提到过我不想要稀疏的矩阵。我的数据实际上并不是那么稀疏。例如,对于CSR矩阵,每个非零值(我认为)由3个数字表示。这意味着对于一个50%满的矩阵,它将比密集版本使用更多的内存。