提问人:Tim Kuipers 提问时间:2/17/2023 最后编辑:Kelly BundyTim Kuipers 更新时间:2/18/2023 访问量:90
如何在 Python 中获取带有环绕的子列表
How can I get a sublist with wraparound in Python
问:
简单的一维案例
我想得到一个带环绕的子字符串。
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''')
我想让所有子矩阵都集中在某个位置,包括 。索引 with 不起作用 ,也不起作用(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 数组时,这种方法可能会变得非常麻烦。
我希望会有一个简单的解决方案。也许 numpy 可以在这里提供帮助?
答:
只需自己将两半组合起来:
>>> str[-7:]+str[:5]
'Python==Hell'
评论
您可以充分重复您的数据,这样您就不需要环绕。
长度为 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])
输出(在线尝试!
[[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]]
对于更大的多维数组,简单添加的 mmore 超出了必要的范围。您实际上只需要在每个维度上增加大小,而不是增加 .就像我对字符串所做的那样。不知道如何使用数组做到这一点。另外,我认为你也可以让你的负指数发挥作用,所以我们只需要有人来做这件事。np.tile
+ r-1
* 2
使用高级索引(请参阅以“从 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)])
输出(在线尝试!
[[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])
输出(在线尝试!
[[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]]])
评论
ix_
m[rowrange, colrange]
np.newaxis
上一个:计算一维数组所有可能切片的平均值
评论
for i in range(len(s)): print(s[i:i+3])