python 数组组合_使用numpy构建两个数组的所有组合的数组

这是一个纯numpy实现。它比使用itertools快约5倍。import numpy as np

def cartesian(arrays, out=None):

"""

Generate a cartesian product of input arrays.

Parameters

----------

arrays : list of array-like

1-D arrays to form the cartesian product of.

out : ndarray

Array to place the cartesian product in.

Returns

-------

out : ndarray

2-D array of shape (M, len(arrays)) containing cartesian products

formed of input arrays.

Examples

--------

>>> cartesian(([1, 2, 3], [4, 5], [6, 7]))

array([[1, 4, 6],

[1, 4, 7],

[1, 5, 6],

[1, 5, 7],

[2, 4, 6],

[2, 4, 7],

[2, 5, 6],

[2, 5, 7],

[3, 4, 6],

[3, 4, 7],

[3, 5, 6],

[3, 5, 7]])

"""

arrays = [np.asarray(x) for x in arrays]

dtype = arrays[0].dtype

n = np.prod([x.size for x in arrays])

if out is None:

out = np.zeros([n, len(arrays)], dtype=dtype)

m = n / arrays[0].size

out[:,0] = np.repeat(arrays[0], m)

if arrays[1:]:

cartesian(arrays[1:], out=out[0:m,1:])

for j in xrange(1, arrays[0].size):

out[j*m:(j+1)*m,1:] = out[0:m,1:]

return out

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值