Python中的循环数组索引

7 投票
3 回答
12963 浏览
提问于 2025-04-18 00:59

我想要得到一个循环的数组(或者说矩阵),也就是说:

假设:

 a = [1,2,3]

那么我希望得到:

a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 1
a[4] = 2

这样对于数组a的所有索引值都是如此。

这样做的原因是因为我有一张图像以矩阵的形式存在,我想处理它,使得如果图像在某个方向上超出了边界,它应该在对面重新出现。

如果有任何简单的方法可以做到这一点,我将非常感激!

3 个回答

0

你可以很简单地这样做:

mainArr = [5,2,1,4,2]
def getRangeArray(startIndexInMainArray):
    s = mainArr[startIndexInMainArray::]
    b=len(mainArr)-len(s)
    return (s+mainArr[0:b])

print(mainArr)
print(getRangeArray(4)) # What is the first index?

#for index 4
#[5, 2, 1, 4, 2]  before
#[2, 5, 2, 1, 4]  after

#for index 2
#[5, 2, 1, 4, 2]  before
#[1, 4, 2, 5, 2]  after

#for index 0
#[5, 2, 1, 4, 2]  before
#[5, 2, 1, 4, 2]  after
0

这样的功能对你的代码来说并不好。与其这样,不如写一个生成器函数,来生成循环的值。

numbers = [1, 2, 3]

def returnNumber():
    """
    A circular array for yielding list members repeatedly 
    """
    index = -1
    while True:
        index += 1
        yield slangWords[index % len(numbers)]

# Now you can use this generator
numberGenerator = returnNumber()
numberGenerator.next() # returns 1 
numberGenerator.next() # returns 2
numberGenerator.next() # returns 3
numberGenerator.next() # returns 1
numberGenerator.next() # returns 2
12

你可以使用取模运算符,像这样

print a[3 % len(a)] 

如果你不想使用取模运算符,那你需要创建一个新的类,继承自 list,并自己实现 __getitem__ 方法。

class CustomList(list):
    def __getitem__(self, index):
        return super(CustomList, self).__getitem__(index % len(self))

a = CustomList([1, 2, 3])
for index in xrange(5):
    print index, a[index]

输出结果

0 1
1 2
2 3
3 1
4 2

如果你想对 Numpy 数组做同样的事情,可以这样做

import numpy as np

class CustomArray(np.ndarray):
    def __new__(cls, *args, **kwargs):
        return np.asarray(args[0]).view(cls)

    def __getitem__(self, index):
        return np.ndarray.__getitem__(self, index % len(self))

a = CustomArray([1, 2, 3])
for index in xrange(5):
    print a[index]

关于如何继承 Numpy 数组的更多信息,可以在 这里 找到(感谢 JonClements

撰写回答