Используя numpy для создания массива всех комбинаций двух массивов

Я рекомендую пройти эти Лекции Видео JavaScript (15 из них).

132
задан Fermi paradox 21 January 2016 в 19:18
поделиться

2 ответа

itertools.combinations , как правило, самый быстрый способ получить комбинации из контейнера Python (если вам действительно нужны комбинации, т. Е. Расположения БЕЗ повторов и независимо от порядка; это не что, по-видимому, делает ваш код, но я не могу сказать, потому что ваш код содержит ошибки или вы используете неправильную терминологию).

Если вам нужно что-то отличное от комбинаций, возможно, другие итераторы в itertools, продукт или перестановки , могут вам помочь. Например, похоже, что ваш код примерно такой же, как:

for val in itertools.product(np.arange(0, 1, 0.1), repeat=6):
    print F(val)

Все эти итераторы выдают кортежи, а не списки или массивы numpy, поэтому, если ваш F придирчив к получению именно массива numpy, вы '

33
ответ дан 24 November 2019 в 00:08
поделиться

Вот простая реализация. Это ок. В 5 раз быстрее, чем при использовании itertools.


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
151
ответ дан 24 November 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: