如何在Python中获得一个带绕回功能的子列表

mzsu5hc0  于 2023-02-18  发布在  Python
关注(0)|答案(3)|浏览(82)

简单的1D案例

我想得到一个带回绕的子字符串。

str = "=Hello community of Python="
#      ^^^^^               ^^^^^^^  I want this wrapped substring

str[-7]
> 'P'

str[5]
> 'o'

str[-7:5]
> ''

为什么序列的这一片从负索引开始到正索引结束会导致一个空字符串?
我怎样才能让它输出“Python==Hell”呢?

高维情况

在这个简单的例子中,我可以做一些剪切和粘贴,但在我的实际应用程序中,我想得到一个更大的网格的大小为2x2的每个子网格-与环绕。

m = np.mat('''1 2 3; 
              4 5 6; 
              7 8 9''')

我想得到所有以(x, y)为中心的子矩阵,包括'9 7; 3 1',用m[x-1:y+1]索引对(x,y)=(0,0)不起作用,(x,y)=(1,0)也不能给予7 8; 1 2

3D示例

m3d = np.array(list(range(27))).reshape((3,3,3))
>
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

m3d[-1:1,-1:1,-1:1]
# doesn't give [[[26, 24], [20, 18]], [8, 6], [2, 0]]]

如果需要的话,我可以写一些代码来得到不同的子矩阵,然后把它们粘在一起,但是当我不得不把同样的方法应用到3d数组上时,这种方法可能会变得相当麻烦。
我希望能有个简单的解决办法。也许麻木能帮上忙?

d6kp6zgx

d6kp6zgx1#

你可以重复你的数据足够,所以你不需要绕回。
长度为3的子字符串:

s = 'Python'
r = 3

s2 = s + s[:r-1]
for i in range(len(s)):
    print(s2[i:i+r])

输出:

Pyt
yth
tho
hon
onP
nPy

大小为2 × 2的子矩阵:

import numpy as np

m = np.mat('''1 2 3; 
              4 5 6; 
              7 8 9''')
r = 2

m2 = np.tile(m, (2, 2))
for i in range(3):
    for j in range(3):
        print(m2[i:i+r, j:j+r])

输出(Attempt This Online!):

[[1 2]
 [4 5]]
[[2 3]
 [5 6]]
[[3 1]
 [6 4]]
[[4 5]
 [7 8]]
[[5 6]
 [8 9]]
[[6 4]
 [9 7]]
[[7 8]
 [1 2]]
[[8 9]
 [2 3]]
[[9 7]
 [3 1]]

对于更大的多维数组,简单的np.tile增加了m,你只需要在每个维度上增加+ r-1,而不是* 2,就像我对字符串所做的那样,不知道如何对数组做好,另外我认为你也可以让你的负索引工作,所以我们只需要有人来做这件事。

pu3pd22g

pu3pd22g2#

使用高级索引(请参见以 "应从4x3阵列中使用高级索引选择角元素" 开头的部分):

import numpy as np

m = np.mat('''1 2 3; 
              4 5 6; 
              7 8 9''')

print(m[np.ix_(range(-1, 1), range(-1, 1))])
print(m[np.ix_(range(-2, 2), range(-2, 2))])
print(m[np.arange(-2, 2)[:, np.newaxis], range(-2, 2)])

输出(Attempt This Online!):

[[9 7]
 [3 1]]
[[5 6 4 5]
 [8 9 7 8]
 [2 3 1 2]
 [5 6 4 5]]
[[5 6 4 5]
 [8 9 7 8]
 [2 3 1 2]
 [5 6 4 5]]

遍历所有子矩阵

既然你想遍历所有的子矩阵,我们可以事先分别准备好行范围和列范围,然后使用它们的配对来快速索引:

import numpy as np

A = np.mat('''1 2 3; 
              4 5 6; 
              7 8 9''')

m, n = A.shape

rowranges = [
    (np.arange(i, i+2) % m)[:, np.newaxis]
    for i in range(m)
]
colranges = [
    np.arange(j, j+2) % n
    for j in range(n)
]

for rowrange in rowranges:
    for colrange in colranges:
        print(A[rowrange, colrange])

输出(Attempt This Online!):

[[1 2]
 [4 5]]
[[2 3]
 [5 6]]
[[3 1]
 [6 4]]
[[4 5]
 [7 8]]
[[5 6]
 [8 9]]
[[6 4]
 [9 7]]
[[7 8]
 [1 2]]
[[8 9]
 [2 3]]
[[9 7]
 [3 1]]

3D用例

m3d = np.array(list(range(27))).reshape((3,3,3))
m3d[np.ix_(range(-1,1), range(-1,1), range(-1,1))]

输出:

array([[[26, 24],
        [20, 18]],

       [[ 8,  6],
        [ 2,  0]]])
xtupzzrd

xtupzzrd3#

只需将两个部分结合起来即可:

>>> str[-7:]+str[:5]
'Python==Hell'

相关问题