python - 优化测试来自多个 NumPy 数组的所有行组合
问题描述
我有三个NumPy整数数组,列数相同,行数任意。我对第一个的一行加上第二个的一行给出第三个的行的所有实例感兴趣([3, 1, 4] + [1, 5, 9] = [4, 6, 13 ])。
这是一个伪代码:
for i, j in rows(array1), rows(array2):
if i + j is in rows(array3):
somehow store the rows this occured at (eg. (1,2,5) if 1st row of
array1 + 2nd row of array2 give 5th row of array3)
我需要为非常大的矩阵运行它,所以我有两个问题:
(1)我可以使用嵌套循环编写上述内容,但有没有更快的方法,也许是列表推导或itertools?
(2) 存储三元组的最快/最节省内存的方法是什么?稍后我将需要创建一个热图,使用两个作为坐标,第一个作为相应的值,例如。在伪代码示例中,点 (2,5) 的值为 1。
非常感谢任何提示 - 我知道这听起来很简单,但它需要快速运行,而且我对优化的经验很少。
编辑:评论中要求我的丑陋代码
import numpy as np
#random arrays
A = np.array([[-1,0],[0,-1],[4,1], [-1,2]])
B = np.array([[1,2],[0,3],[3,1]])
C = np.array([[0,2],[2,3]])
#triples stored as numbers with 2 coordinates in a otherwise-zero matrix
output_matrix = np.zeros((B.shape[0], C.shape[0]), dtype = int)
for i in range(A.shape[0]):
for j in range(B.shape[0]):
for k in range(C.shape[0]):
if np.array_equal((A[i,] + B[j,]), C[k,]):
output_matrix[j, k] = i+1
print(output_matrix)
解决方案
我们可以利用broadcasting
向量化的方式执行所有这些求和和比较,然后使用np.where
它来获取与匹配的索引对应的索引,最后索引并分配 -
output_matrix = np.zeros((B.shape[0], C.shape[0]), dtype = int)
mask = ((A[:,None,None,:] + B[None,:,None,:]) == C).all(-1)
I,J,K = np.where(mask)
output_matrix[J,K] = I+1
推荐阅读
- c# - 如果项目不在下拉列表中,则在 Wpf ComboBox 中键入的行为会很慢
- php - Laravel 发布表单未提交?
- algorithm - 如何在 Lisp(scheme) 中编写幂函数?我的程序有什么问题?
- r - 如何在闪亮的 R 中更新 url
- swift - onDelete() 函数处理程序如何在 swiftUI 列表中工作?
- php - PHP Google Drive Api - 回显在 if (!empty($_POST)) 块中不起作用
- javascript - 如何使用react js在段落中显示结果
- time-complexity - 为什么n^2 logn + n(logn)^2 = O(n^2(logn)^2)的时间复杂度?
- c# - 一般铸造混乱
- python - 如果 Flask 上不存在表,如何使用 SQLAlchemy 创建表?