将矩阵定义转换为零索引表示法 - Numpy

时间:2017-04-18 04:49:38

标签: python arrays numpy matrix

我正在尝试从使用非标准索引构建矩阵的纸张构造一个numpy数组(一个二维numpy数组 - 即一个矩阵)。即左上角的元素是q 1,2 。而不是q 0,0

n和{{1}的元素q i,j 定义(n-2) x i = i,...,n矩阵 Q 由...给出 q j-1,j = h -1 j-1 ,q j,j = h -1 j-1 - h -1 j 和q j + 1,j = H Ĵ <子> J-1 。 (我在这里以Latex形式发布了这个:http://www.texpaste.com/n/8vwds4fx

我试图像这样在python中实现:

j = 2, ... , n-1

但我总是得到错误:

# n = u_s.size
# n = 299 for this example
n = 299
Q = np.zeros((n,n-2))

for i in range(0,n+1):
    for j in range(2,n):
        Q[j-1,j] = 1.0/h[j-1]
        Q[j,j] = -1.0/h[j-1] - 1.0/h[j]
        Q[j+1,j] = 1.0/h[j]

我最初认为我可以在我的--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-54-c07a3b1c81bb> in <module>() 1 for i in range(1,n+1): 2 for j in range(2,n-1): ----> 3 Q[j-1,j] = 1.0/h[j-1] 4 Q[j,j] = -1.0/h[j-1] - 1.0/h[j] 5 Q[j+1,j] = 1.0/h[j] IndexError: index 297 is out of bounds for axis 1 with size 297 循环中减少ij以保证边缘情况的安全,这是一种快速转向零索引表示法的方法,但这并没有& #39; t工作。我还尝试增加和修改for

有没有办法将此定义转换为python可以处理的定义?这是一个常见的问题吗?

2 个答案:

答案 0 :(得分:1)

简化问题以使分配模式变得明显:

In [228]: h=np.arange(10,15)
In [229]: Q=np.zeros((5,5),int)
In [230]: for j in range(1,5):
     ...:     Q[j-1:j+2,j] = h[j-1:j+2]

In [231]: Q
Out[231]: 
array([[ 0, 10,  0,  0,  0],
       [ 0, 11, 11,  0,  0],
       [ 0, 12, 12, 12,  0],
       [ 0,  0, 13, 13, 13],
       [ 0,  0,  0, 14, 14]])

对部分第一列和最后一列的分配可能需要调整。这是从对角线构建的等价物:

In [232]: np.diag(h,0)+np.diag(h[:-1],1)+np.diag(h[1:],-1)
Out[232]: 
array([[10, 10,  0,  0,  0],
       [11, 11, 11,  0,  0],
       [ 0, 12, 12, 12,  0],
       [ 0,  0, 13, 13, 13],
       [ 0,  0,  0, 14, 14]])

使用h[j-1]h[j]索引此对角线分配可能需要调整,但它应该是一个有用的起点。

选择h值更像您使用的内容(暂时跳过1/h):

In [238]: Q=np.zeros((5,5),int)
In [239]: for j in range(1,4):
     ...:     Q[j-1:j+2,j] =[h[j-1],h[j-1]+h[j], h[j]]
     ...:     
In [240]: Q
Out[240]: 
array([[ 0, 10,  0,  0,  0],
       [ 0, 21, 11,  0,  0],
       [ 0, 11, 23, 12,  0],
       [ 0,  0, 12, 25,  0],
       [ 0,  0,  0, 13,  0]])

我现在正在跳过两个部分结束列。第一种切片方法让我有点草率,因为它可以切断“结束”。结束列(如果已设置)将需要自己的表达式。

In [241]: j=0; Q[j:j+2,j] =[h[j], h[j]]  
In [242]: j=4; Q[j-1:j+1,j] =[h[j-1],h[j-1]+h[j]] 
In [243]: Q
Out[243]: 
array([[10, 10,  0,  0,  0],
       [10, 21, 11,  0,  0],
       [ 0, 11, 23, 12,  0],
       [ 0,  0, 12, 25, 13],
       [ 0,  0,  0, 13, 27]])

相关的对角线片仍然很明显:

In [244]: h[1:]+h[:-1]
Out[244]: array([21, 23, 25, 27])

答案 1 :(得分:0)

该等式不包含i的任何值。它仅指j。 Q应该是维数为n + 2 x n + 2的矩阵。对于j = 1,它指的是Q [0,1],Q [1,1]和Q [2,1]。对于j = n,它指的是Q [n-1,n],Q [n,n]和Q [n + 1,n]。因此,Q应该具有从0到n + 1的索引,其中n + 2

我不认为,你需要i循环。只有j循环从1到n才能获得结果,但Q应该从0到n + 1