尝试了解python矩阵中的索引切片语法

时间:2019-12-07 05:21:43

标签: python arrays numerical-analysis numpy-slicing

我一直在查看并解释一些示例代码,但在理解一些切片语法时遇到了一些麻烦。在某些情况下,我正在研究一个计算程序,该程序使用有限差分法近似于正方形区域的温度。

以下是一些代码:

maxIter = 500
lenX = lenY = 20 
delta = 1
Ttop = 100
Tbottom = 0
Tleft = 0
Tright = 0
Tguess = 30

T = np.empty((lenX, lenY))
T.fill(Tguess)

T[(lenY-1):, :] = Ttop
T[:1, :] = Tbottom
T[:, (lenX-1):] = Tright
T[:, :1] = Tleft

最后一点是我难以理解。我不确定在T []边界条件下冒号和逗号的放置情况。代码的下一部分继续进行T [i,j]的for循环。 就像看第一个一样,它似乎在T切片的第一个索引中从9(lenY-1)到列表的末尾,而在第二个索引中则不切片任何东西,然后将其设置为100。沿着最高边界100的温度,我只是不确定目前的语法是怎么回事。

2 个答案:

答案 0 :(得分:2)

冒号表达式作为slice对象传送到numpy数组。逗号创建一个元组。进行演示:

class A:
    def __setitem__(self, target, data):
        print(repr(target))
        print(repr(data))

a = A()
a[17:, :] = 6

打印:

(slice(17, None, None), slice(None, None, None))
6

所以你也可以写:

a[(slice(17, None, None), slice(None, None, None))] = 6

在最后一行具有相同的结果。

然后类(例如numpy数组)的职责以有意义的方式解释它。

答案 1 :(得分:2)

假设x是具有N个元素的NumPy数组,索引为0..N-1。您可以说x[:k]表示0..k-1中的所有元素,x[k:]表示k..N-1,x[k1:k2]表示k1..k2-1。最后,x[:]表示所有元素。

因此,在您的代码中,四行正在设置:

  • 最后一行,所有Ttop
  • 第一行,所有列为Tbottom
  • 所有行,最后一列到Tright
  • 所有行,第一列到Tleft

切片文档可能是以后的不错参考:https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

您可以通过在Python命令行界面中执行每次操作后打印T来快速证明这一点。启动python,import numpy as np,将lenXlenY更改为较小的名称以便于阅读,并将初始化值更改为唯一值,以便我们跟踪更改:

>>> lenX = lenY = 5
>>> Ttop = 100
>>> Tbottom = 200
>>> Tleft = 300
>>> Tright = 400
>>> Tguess = 30
>>> T = np.empty((lenX, lenY))
>>> T.fill(Tguess)

然后走了:

>>> T[(lenY-1):, :] = Ttop
>>> T
array([[ 30.,  30.,  30.,  30.,  30.],
       [ 30.,  30.,  30.,  30.,  30.],
       [ 30.,  30.,  30.,  30.,  30.],
       [ 30.,  30.,  30.,  30.,  30.],
       [100., 100., 100., 100., 100.]])
>>> T[:1, :] = Tbottom
>>> T
array([[200., 200., 200., 200., 200.],
       [ 30.,  30.,  30.,  30.,  30.],
       [ 30.,  30.,  30.,  30.,  30.],
       [ 30.,  30.,  30.,  30.,  30.],
       [100., 100., 100., 100., 100.]])
>>> T[:, (lenX-1):] = Tright
>>> T
array([[200., 200., 200., 200., 400.],
       [ 30.,  30.,  30.,  30., 400.],
       [ 30.,  30.,  30.,  30., 400.],
       [ 30.,  30.,  30.,  30., 400.],
       [100., 100., 100., 100., 400.]])
>>> T[:, :1] = Tleft
>>> T
array([[300., 200., 200., 200., 400.],
       [300.,  30.,  30.,  30., 400.],
       [300.,  30.,  30.,  30., 400.],
       [300.,  30.,  30.,  30., 400.],
       [300., 100., 100., 100., 400.]])