python itertools.product_python – Numpy相当于itertools.product

这个问题已被问过几次:

Using numpy to build an array of all combinations of two arrays

itertools product speed up

第一个链接有一个工作numpy解决方案,声称比itertools快几倍,但没有提供基准测试.此代码由名为pv的用户编写.如果您觉得有用,请点击链接并支持他的回答:

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

然而,在同一篇文章中,Alex Martelli–他是SO的伟大Python大师 – 写道,itertools是完成这项任务的最快方法.所以这是一个快速的基准,证明了亚历克斯的话.

import numpy as np

import time

import itertools

def cartesian(arrays, out=None):

...

def test_numpy(arrays):

for res in cartesian(arrays):

pass

def test_itertools(arrays):

for res in itertools.product(*arrays):

pass

def main():

arrays = [np.fromiter(range(100), dtype=int), np.fromiter(range(100, 200), dtype=int)]

start = time.clock()

for _ in range(100):

test_numpy(arrays)

print(time.clock() - start)

start = time.clock()

for _ in range(100):

test_itertools(arrays)

print(time.clock() - start)

if __name__ == '__main__':

main()

输出:

0.421036

0.06742

所以,你绝对应该使用itertools.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值