преобразуйте вещание в нечто поддающееся расчету. матрица np.кратная

#python #arrays #numpy #performance #optimization

Вопрос:

Я пытаюсь рассчитать этот тип расчета:

 arr = np.arange(4)  # array([0, 1, 2, 3])  arr_t =arr.reshape((-1,1)) # array([[0], # [1], # [2], # [3]])  mult_arr = np.multiply(arr,arr_t) # lt;lt;lt; the multiplication # array([[0, 0, 0, 0], # [0, 1, 2, 3], # [0, 2, 4, 6], # [0, 3, 6, 9]])  

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

 arr = np.random.random((600,150))  arr_t =arr.reshape((-1,arr.shape[1],1))   mult = np.multiply(arr[:,None],arr_t) summed = np.sum(mult,axis=0) summed  

До сих пор все это было просто потрясающе, проблема начинается, когда я пытаюсь скрыть больший набор данных, например, вместо этого этот массив :

 arr = np.random.random((6000,1500))  

Я получаю следующую ошибку — MemoryError: Unable to allocate 101. GiB for an array with shape (6000, 1500, 1500) and data type float64 что имеет смысл, но мой вопрос в том:

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

мой вопрос в основном касается производительности, и решение, требующее длительных задач более 30 секунд, не является вариантом.

Ответ №1:

Похоже, вы просто пытаетесь выполнить точечный продукт:

 arr.T@arr  

или

 arr.T.dot(arr)  
проверьте, что это то, что вы хотите
 arr = np.random.random((600,150))  arr_t =arr.reshape((-1,arr.shape[1],1)) mult = np.multiply(arr[:,None],arr_t) summed = np.sum(mult,axis=0)  np.allclose((arr.T@arr), summed) # True  

Комментарии:

1. можете показать математически, как вы это выяснили?

2. Сначала это было больше похоже на интуицию, я видел, как вы выполнили транслируемое умножение транспонированной матрицы, затем сумму, на самом деле это определение умножения матрицы 😉 Вы также можете использовать matmul

3. из-за слишком большого количества программных проблем мой мозг больше не распознает математику… должен как можно скорее освежить мой разум