#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. из-за слишком большого количества программных проблем мой мозг больше не распознает математику… должен как можно скорее освежить мой разум