我一直在查看并解释一些示例代码,但在理解一些切片语法时遇到了一些麻烦。在某些情况下,我正在研究一个计算程序,该程序使用有限差分法近似于正方形区域的温度。
以下是一些代码:
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的温度,我只是不确定目前的语法是怎么回事。
答案 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
,将lenX
和lenY
更改为较小的名称以便于阅读,并将初始化值更改为唯一值,以便我们跟踪更改:
>>> 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.]])