如何在嵌套列表中使用多个矢量点积?

时间:2019-11-27 05:51:33

标签: python numpy

我试图在嵌套列表中获得矢量点积 例如:

A = np.array([[1,2,1,3],[2,1,2,3],[3,1,2,4]])

我试图得到:

B = [[15], [19, 23]]

其中15 = np.dot(A [0],A [1]),

19 = np.dot(A [0],A [2]),

23 = np.dot(A [1],A [2])

B中的拳头inner_list是A [0]和A [1]的点积,

B中的第二个inner_list是 A [0]和A [2]的点积,A [1]和A [2]的点积 我试图在python中写一些循环但是失败了 如何在Python中获取B?

2 个答案:

答案 0 :(得分:1)

这是一个显式的for循环,结合了列表理解解决方案:

In [1]: import numpy as np

In [2]: A = np.array([[1,2,1,3],[2,1,2,3],[3,1,2,4]])

In [5]: def get_dp(A):
   ...:     out = []
   ...:     for i, a in enumerate(A[1:]):
   ...:         out.append([np.dot(a, b) for b in A[:i+1]])
   ...:     return out

In [6]: get_dp(A)
Out[6]: [[15], [19, 23]]

说明:for循环从第二个元素开始运行,列表推导从头开始运行到当前迭代的元素。

答案 1 :(得分:0)

一个迭代器类,它吐出与B相同的元素。 如果需要完整列表,可以list(iter_dotprod(A))

示例:

class iter_dotprod:

    def __init__(self, nested_arr):
        self.nested_arr = nested_arr
        self.hist = []

    def __iter__(self):
        self.n = 0
        return self

    def __next__(self):
        if self.n > len(self.nested_arr) -2:
            raise StopIteration

        res = np.dot(self.nested_arr[self.n], self.nested_arr[self.n+1])
        self.hist.append(res)
        self.n += 1
        return self.hist

A = np.array([[1,2,1,3],[2,1,2,3],[3,1,2,4]])
tt = iter_dotprod(A)

for b in iter_dotprod(A):
    print(b)