我希望获得一个圆形的数组(或矩阵),以便
让:
a = [1,2,3]
然后我想
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 1
a[4] = 2
等于a的所有索引值。
原因是因为我有一个图像作为一个矩阵,而我试图处理它的行为是,如果它在一个方向偏离边缘,它应该重新出现在另一边。
非常感谢任何有关如何干净利落的提示!
答案 0 :(得分:8)
你可以使用modulo运算符,就像这样
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 Arrays做同样的事情,你可以这样做
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 Arrays的更多信息,请here(感谢JonClements)
答案 1 :(得分: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
答案 2 :(得分: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