我正在尝试从使用非标准索引构建矩阵的纸张构造一个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
循环中减少i
和j
以保证边缘情况的安全,这是一种快速转向零索引表示法的方法,但这并没有& #39; t工作。我还尝试增加和修改for
。
有没有办法将此定义转换为python可以处理的定义?这是一个常见的问题吗?
答案 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