Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确定哪些向量组合将与另一个向量求和_Python_Python 3.x_Vector_Linear Algebra - Fatal编程技术网

Python 确定哪些向量组合将与另一个向量求和

Python 确定哪些向量组合将与另一个向量求和,python,python-3.x,vector,linear-algebra,Python,Python 3.x,Vector,Linear Algebra,我使用Python3试图找到一组向量的线性组合将和另一个向量相加。我使用numpy数组作为向量 例如,我将有一个目标向量和矩阵“选择”,其中包含所有可能的向量选择: targetvector0 = numpy.array([0, 1, 2]) choices = numpy.array([[0, 1, 0], [0, 0, 1], [0, 0, 2], [1, 1, 0]]) 我需要返回所有可能的组合和它们的整数倍(需要是整数倍),这些组合和目标相加,而忽略那些没有: option1 = [

我使用Python3试图找到一组向量的线性组合将和另一个向量相加。我使用numpy数组作为向量

例如,我将有一个目标向量和矩阵“选择”,其中包含所有可能的向量选择:

targetvector0 = numpy.array([0, 1, 2])

choices = numpy.array([[0, 1, 0], [0, 0, 1], [0, 0, 2], [1, 1, 0]])
我需要返回所有可能的组合和它们的整数倍(需要是整数倍),这些组合和目标相加,而忽略那些没有:

option1 = [[1], [2], [0], [0]]
option2 = [[1], [0], [1], [0]]

我在
numpy.linalg.solve(x,y)
上找到了一些信息,但它并不完全符合我的要求,或者我不知道如何有效地使用它。

我想你正在搜索的倍数都是正数

您可以仔细地增加倍数,研究得出结果不大于目标向量的所有组合

import numpy as np


def solve(target_vector, choices):
    nb_choices, n = choices.shape
    factors = np.zeros((1, nb_choices), dtype=np.int)
    i = 0

    while True:
        if i == nb_choices - 1:
            return

        factors[0, i] += 1
        difference_to_target = factors.dot(choices) - targetvector

        found_solution = np.all(difference_to_target == 0)
        factors_too_high = np.any(difference_to_target > 0)

        if found_solution:
            yield factors.copy()

        if found_solution or factors_too_high:
            factors[0, :i + 1] = 0
            i += 1
            continue

        i = 0


targetvector = np.array([0, 1, 2])
choices = np.array([[0, 1, 0], [0, 0, 1], [0, 0, 2], [1, 1, 0]])
print(list(solve(targetvector, choices)))
# [array([[1, 2, 0, 0]]), array([[1, 0, 1, 0]])]

谢谢你提供的信息。是的,随着选择的增加,倍数将是正的。关于你所写的代码,你有什么建议吗?我想我明白了,但我想在使用它之前得到一个更坚实的理解。我自己做的,所以我不能给你任何具体的链接。我不能告诉你它是否是最优的,但它似乎是有效的。