NumPy的矩阵运算

我要计算所有下列值ij

M_ki = Sum[A_ij - A_ik - A_kj + A_kk, 1 <= j <= n]

我能如何使用NumPy的(蟒蛇)没有一个明确的循环呢?

谢谢!

--------------解决方案-------------

下面是解决此类问题的一个总体战略。

首先,写一个小的脚本,并在两个不同的功能明确写入循环中,并在结束测试确保两个功能是完全一样的:

import numpy as np
from numpy import newaxis

def explicit(a):
n = a.shape[0]
m = np.zeros_like(a)
for k in range(n):
for i in range(n):
for j in range(n):
m[k,i] += a[i,j] - a[i,k] - a[k,j] + a[k,k]
return m

def implicit(a):
n = a.shape[0]
m = np.zeros_like(a)
for k in range(n):
for i in range(n):
for j in range(n):
m[k,i] += a[i,j] - a[i,k] - a[k,j] + a[k,k]
return m

a = np.random.randn(10,10)
assert np.allclose(explicit(a), implicit(a), atol=1e-10, rtol=0.)

然后,通过编辑矢量化由步骤的功能步骤implicit ,在每一步运行脚本,以确保它们能继续保持相同:

步骤1

def implicit(a):
n = a.shape[0]
m = np.zeros_like(a)
for k in range(n):
for i in range(n):
m[k,i] = (a[i,:] - a[k,:]).sum() - n*a[i,k] + n*a[k,k]
return m

第2步

def implicit(a):
n = a.shape[0]
m = np.zeros_like(a)
m = - n*aT + n*np.diag(a)[:,newaxis]
for k in range(n):
for i in range(n):
m[k,i] += (a[i,:] - a[k,:]).sum()
return m

第3步

def implicit(a):
n = a.shape[0]
m = np.zeros_like(a)
m = - n*aT + n*np.diag(a)[:,newaxis]
m += (aT[newaxis,...] - a[...,newaxis]).sum(1)
return m

等瞧“! 没有循环中的最后一个。 向量化那种方程,广播是要走的路!

警告:要确保explicit是,你要矢量化的方程。 我不知道,如果不依赖于条件j也应求和。

分类:蟒蛇 时间:2015-03-14 人气:0
本文关键词: 蟒蛇,矩阵,numpy的
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.866 (s). 10 q(s)