Изменить тип данных одного элемента в матрице - PullRequest
0 голосов
/ 03 апреля 2020

Я рассчитываю реализовать аппаратно-эффективное умножение списка больших матриц (порядка 200 000 x 200 000). Матрицы очень похожи на единичную матрицу, но некоторые элементы заменены на иррациональные числа.

Чтобы уменьшить объем памяти и ускорить вычисления go, я хочу сохранить 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

Возможно удерживать только эти элементы матрицы с другой тип данных, в то время как все остальные элементы все еще байты? Я не хочу менять все на плавающее только потому, что мне нужно, чтобы один элемент был плавающим.

----- Edit -----

Если это не так возможно в numpy, тогда как мне найти решение без numpy?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Может быть, вы можете взглянуть на Разреженную матрицу SciPy . В этом случае SciPy создает разреженную матрицу (оптимизированную для таких больших пустых матриц), и с ее форматом координат вы можете обращаться к данным и изменять их по своему усмотрению.

Из своей документации:

>>> from scipy.sparse import coo_matrix
>>> # Constructing a matrix using ijv format
>>> row  = np.array([0, 3, 1, 0])
>>> col  = np.array([0, 3, 1, 2])
>>> data = np.array([4, 5, 7, 9])
>>> m = coo_matrix((data, (row, col)), shape=(4, 4))
>>> m.toarray()
array([[4, 0, 9, 0],
       [0, 7, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 5]])

Он создает не матрицу, а набор координат со значениями, который занимает гораздо меньше места, чем просто заполнение матрицы нулями.

>>> from sys import getsizeof
>>> getsizeof(m)
56
>>> getsizeof(m.toarray())
176
0 голосов
/ 03 апреля 2020

По определению, NumPy массивы имеют только один тип d. Вы можете увидеть в документации 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.

Дополнительная информация: https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

...