python - 一次生成 numpy 数组元素的组合,并且在运行中
问题描述
我知道这是一个非常微不足道的问题,但我无法找到合适的解决方案。我有两个从两个不同的元组列表创建的 numpy 数组。
a = np.array([(1, 2), (3, 4), (5, 6)....])
b = np.array([(100, 200), (300, 400), (500, 600)....])
我有一个函数,它将两个元组作为输入并返回单个值作为输出
def myfunc(x, y):
.....
return val
vectorized_myfunc = np.vectorize(myfunc, signature='(n),(n)->()')
我想要达到的目标:
- 生成元素的所有组合与 中
a
的每个元素b
。喜欢((1, 2), (100, 200)), ((1, 2), (300, 400))..
- 将生成的组合传递给
vectorized_myfunc
. - 如果我想动态生成这些组合的块然后执行 1) 和 2) 怎么办?
PS:我知道我可以使用itertools.product(..)
,但它很慢。
PPS:我尝试使用np.stack(np.meshgrid(a, b), -1).reshape(-1, 2, 3)
然后尝试将其传递给vectorized_myfunc
但无法使其正常工作
我愿意使用,numpy
甚至dask
愿意numba
解决方案
您可以像这样处理索引a
的组合:b
def product(arrays):
# the same as itertools.product(*arrays)
return np.stack(np.meshgrid(*arrays), axis=-1).reshape(-1, len(arrays))
a = np.array([(1, 2), (3, 4), (5, 6)])
b = np.array([(100, 200), (300, 400), (500, 600)])
idx = product([np.arange(len(a)), np.arange(len(b))])
检查:
>>> idx
array([[0, 0],
[1, 0],
[2, 0],
[0, 1],
[1, 1],
[2, 1],
[0, 2],
[1, 2],
[2, 2]])
我对签名没有经验,但以下示例对我有用:
vectorized_myfunc = np.vectorize(lambda x,y: x+y)
>>> vectorized_myfunc(a[idx[:, 0]], b[idx[:, 1]])
array([[101, 202],
[103, 204],
[105, 206],
[301, 402],
[303, 404],
[305, 406],
[501, 602],
[503, 604],
[505, 606]])
更新:我发现了另一个适用于signature
:
vectorized_myfunc = np.vectorize(lambda x,y: np.sum(np.array([x,y])), signature='(j),(j)->()')
>>> vectorized_myfunc(a[idx[:, 0]], b[idx[:, 1]])
array([ 303, 307, 311, 703, 707, 711, 1103, 1107, 1111])
推荐阅读
- php - 以计算机可读格式获取 MySQL 权限
- javascript - 将 FormData 传递给 AJAX 调用时如何修复 HttpPostedFileBase null
- ember.js - Ember 开发服务器似乎在测试模式下运行
- r - 如何通过排除 r 中第 1 组中的前 300 个测量值来计算平均值
- python - Python itertools排列MemoryError
- sql - 如何拥有单个日期字段或更有效地编写它
- c# - Npgsql C#多行/值插入
- scala - 在 spark scala 中查找年月的最小值和最大值
- docker - 詹金斯在第二次构建时没有向我显示初始管理员密码
- amazon-web-services - 将数据从 Amazon Redshift 迁移到 Aurora 数据库