如何用条件进行向量矩阵乘法?

2024-10-04 11:28:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从以下公式中获得一个列表(或数组,无所谓):

A_i = X_(k!=i) * S_(k!=i) * X'_(k!=i)

其中:

X是向量(X'是X的转置),S是矩阵,下标k被定义为{k=1,2,3,…n | k=i} 是的

X = [x1, x2, ..., xn]

S = [[s11,s12,...,s1n],
     [s21,s22,...,s2n]
     [... ...  ... ..]
     [sn1,sn2,...,snn]]

我以以下为例:

X = [0.1,0.2,0.3,0.5]  

S = [[0.4,0.1,0.3,0.5],
     [2,1.5,2.4,0.6]
     [0.4,0.1,0.3,0.5]
     [2,1.5,2.4,0.6]]

所以,最终,我会得到a的四个值的列表

我做到了:

import numpy as np

x = np.array([0.1,0.2,0.3,0.5])
s = np.matrix([[0.4,0.1,0.3,0.5],[1,2,1.5,2.4,0.6],[0.4,0.1,0.3,0.5],[1,2,1.5,2.4,0.6]])

for k in range(x) if k!=i 
A = (x.dot(s)).dot(np.transpose(x))

print (A)

我对如何使用条件“for”循环感到困惑。你能帮我解决这个问题吗?谢谢

编辑: 只是为了解释更多。如果取i=1,则公式为:

  A_1 = X_(k!=1) * S_(k!=1) * X'_(k!=1)

因此,与下标1关联的任何数组(或值)都将在X和S中删除。比如:

X = [0.2,0.3,0.5]  

S = [[1.5,2.4,0.6]
     [0.1,0.3,0.5]
     [1.5,2.4,0.6]]

Tags: 列表for定义np矩阵数组向量dot
2条回答

第1步:正确计算

第二步:收集到一个


我想你要计算的是

enter image description here

一个简单的方法是使用屏蔽数组屏蔽条目。这样我们就不需要删除或复制任何矩阵

# sample
x = np.array([1,2,3,4])
s = np.diag([4,5,6,7])

# we will use masked arrays to remove k=i
vec_mask = np.zeros_like(x)
matrix_mask = np.zeros_like(s)

i = 0  # start

# set masks
vec_mask[i] = 1
matrix_mask[i] = matrix_mask[:,i] = 1

s_mask = np.ma.array(s, mask=matrix_mask)
x_mask = np.ma.array(x, mask=vec_mask)

# reduced product, remember using np.ma.inner instead np.inner
Ai = np.ma.inner(np.ma.inner(x_mask, s_mask), x_mask.T)

vec_mask[i] = 0
matrix_mask[i] = matrix_mask[:,i] = 0

由于0的项不会加到和中,我们实际上可以忽略屏蔽矩阵,而只屏蔽向量:

# we will use masked arrays to remove k=i
mask = np.zeros_like(x)

i = 0  # start

# set masks
mask[i] = 1

x_mask = np.ma.array(x, mask=mask)

# reduced product
Ai = np.ma.inner(np.ma.inner(x_mask, s), x_mask.T)

# unset mask
mask[i] = 0

最后一步是将AA_i中组装出来,所以我们总共得到

x = np.array([1,2,3,4])
s = np.diag([4,5,6,7])

mask = np.zeros_like(x)
x_mask = np.ma.array(x, mask=mask)
A = []
for i in range(len(x)):
    x_mask.mask[i] = 1
    Ai = np.ma.inner(np.ma.inner(x_mask, s), x_mask.T)
    A.append(Ai)
    x_mask.mask[i] = 0
A_vec = np.array(A)

在Python中,使用循环实现矩阵/向量积将相当缓慢。因此,我建议实际删除给定索引处的行/列/元素,并在没有任何显式循环的情况下执行快速的内置点积:

i = 0  # don't forget Python's indices are zero-based

x_ = np.delete(X, i)  # remove element
s_ = np.delete(S, i, axis=0)  # remove row
s_ = np.delete(s_, i, axis=1)  # remove column

result = x_.dot(s_).dot(x_)  # no need to transpose a 1-D array

相关问题 更多 >