Python 更改矩阵中一个元素的数据类型

Python 更改矩阵中一个元素的数据类型,python,numpy,abstract-data-type,complex-data-types,Python,Numpy,Abstract Data Type,Complex Data Types,我希望实现一个大型矩阵列表的硬件高效乘法(大约200000 x 200000)。这些矩阵非常接近于单位矩阵,但有些元素变为无理数 为了减少内存占用并加快计算速度,我希望将标识的0和1存储为单字节,如下所示 import numpy as np size = 200000 large_matrix = np.identity(size, dtype=uint8) 只需将一些元素更改为不同的数据类型 import sympy as sp # sympy object irr1 = sp.sqrt

我希望实现一个大型矩阵列表的硬件高效乘法(大约200000 x 200000)。这些矩阵非常接近于单位矩阵,但有些元素变为无理数

为了减少内存占用并加快计算速度,我希望将标识的0和1存储为单字节,如下所示

import numpy as np
size = 200000
large_matrix = np.identity(size, dtype=uint8)
只需将一些元素更改为不同的数据类型

import sympy as sp

# sympy object
irr1 = sp.sqrt(2)    

# float
irr2 = e               

large_matrix[123456, 100456] = irr1
large_matirx[100456, 123456] = irr2
是否可以仅保存具有不同数据类型的矩阵的这些元素,而所有其他元素仍然是字节?我不想因为我需要一个元素作为浮点,就必须把所有的东西都改成浮点

-----编辑-----


如果在numpy中不可能,那么如何找到没有numpy的解决方案?

根据定义,numpy数组只有一个数据类型。您可以在NumPy文档中看到:

A numpy array is homogeneous, and contains elements described by a dtype object. A dtype object can be constructed from different combinations of fundamental numeric types.

进一步阅读:

根据定义,NumPy数组只有一个数据类型。您可以在NumPy文档中看到:

A numpy array is homogeneous, and contains elements described by a dtype object. A dtype object can be constructed from different combinations of fundamental numeric types.

进一步阅读:

也许你可以看看SciPy的。在这种情况下,SciPy将创建一个稀疏矩阵(针对如此大的空矩阵进行了优化),并使用其坐标格式,您可以根据需要访问和修改数据

根据其文件:

A numpy array is homogeneous, and contains elements described by a dtype object. A dtype object can be constructed from different combinations of fundamental numeric types.
>>来自scipy.sparse导入coo_矩阵
>>>#使用ijv格式构建矩阵
>>>row=np.array([0,3,1,0])
>>>col=np.array([0,3,1,2])
>>>data=np.array([4,5,7,9])
>>>m=coo_矩阵((数据,(行,列)),形状=(4,4))
>>>托雷先生()
数组([[4,0,9,0],
[0, 7, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 5]])
它不创建矩阵,而是创建一组带有值的坐标,这比仅用零填充矩阵占用的空间要小得多

>>来自sys import getsizeof
>>>getsizeof(m)
56
>>>getsizeof(m.toarray())
176

也许你可以看看SciPy的。在这种情况下,SciPy将创建一个稀疏矩阵(针对如此大的空矩阵进行了优化),并使用其坐标格式,您可以根据需要访问和修改数据

根据其文件:

A numpy array is homogeneous, and contains elements described by a dtype object. A dtype object can be constructed from different combinations of fundamental numeric types.
>>来自scipy.sparse导入coo_矩阵
>>>#使用ijv格式构建矩阵
>>>row=np.array([0,3,1,0])
>>>col=np.array([0,3,1,2])
>>>data=np.array([4,5,7,9])
>>>m=coo_矩阵((数据,(行,列)),形状=(4,4))
>>>托雷先生()
数组([[4,0,9,0],
[0, 7, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 5]])
它不创建矩阵,而是创建一组带有值的坐标,这比仅用零填充矩阵占用的空间要小得多

>>来自sys import getsizeof
>>>getsizeof(m)
56
>>>getsizeof(m.toarray())
176

Numpy数组不允许混合类型。这可以在Pandas(数据帧)和xarray(类似于numpy数组,类似于Pandas数据帧)中完成。另一种方法是对非整数数据应用比例因子(如果可以),然后将该值转换为整数。例如,如果只需要pi的前三位小数,则应用1000的比例因子并转换为int(插入值为3141)。混合类型不会加快计算速度
numpy
通过在编译代码中以相同的方式处理数组的所有元素来提高速度。使用
uint8
进行计算没有速度优势。现代处理器经过优化,可与
float64
int64
数字一起工作。任何混合数据类型的尝试都会减慢速度。Numpy数组不允许混合类型。这可以在Pandas(数据帧)和xarray(类似于numpy数组,类似于Pandas数据帧)中完成。另一种方法是对非整数数据应用比例因子(如果可以),然后将该值转换为整数。例如,如果只需要pi的前三位小数,则应用1000的比例因子并转换为int(插入值为3141)。混合类型不会加快计算速度
numpy
通过在编译代码中以相同的方式处理数组的所有元素来提高速度。使用
uint8
进行计算没有速度优势。现代处理器经过优化,可与
float64
int64
数字一起工作。任何混合数据类型的尝试都会减慢速度。OP特别询问了在数组中放置混合类型的问题。这如何允许混合类型?我不熟悉基于坐标的稀疏矩阵,但它似乎不允许混合数据类型。对于稀疏矩阵,它只创建坐标及其对应值的列表,而不实际创建任何数组。这样会忽略所有非零。我更新了我的答案,以便更好地说明将其转换为矩阵时的大小扩展。非零元素仍然必须具有相同的
dtype
,并且它可以用于计算的dtype更加受限(与密集数组相比)。速度不是很快,除了在足够稀疏的矩阵上进行矩阵乘法。OP特别询问了在数组中放置混合类型的问题。这如何允许混合类型?我不熟悉基于坐标的稀疏矩阵,但它似乎不允许混合数据类型。对于稀疏矩阵,它只创建坐标及其对应值的列表,而不实际创建任何数组。这样会忽略所有非零。我更新了我的答案,以便更好地说明将其转换为矩阵时的大小扩展。非零元素仍然必须具有相同的
dtype
,并且它可以用于计算的dtype更加受限(与密集数组相比)。速度不是很快,除了在足够稀疏的矩阵上进行矩阵乘法。