我在Uni为我的python课做了这项功课,我无法理解它。基本上我需要编写一个返回NxN数组的程序(最好在这种情况下使用numpy:
123456
212345
321234
432123
543212
654321
我试图创建一个简单的6x6数组,例如
X = np.full((n,n),np.arange(1,+n+1))
返回
123456
123456
123456
123456
123456
123456
但这些只是用最后一个元素切换最后一个元素的排列和#34;在中间向右推动那些元素,但如前所述,它更复杂。提前谢谢。
答案 0 :(得分:2)
您能否根据X[i,j]
和i
提出j
的公式? (我可以,但这是作业!)
如果是这样,你可以这样做:
is, js = np.indices((n,n))
X = your_formula(is, js)
例如,如果您想要X[i,j] = i + j
,则可以执行
is, js = np.indices((n,n))
X = is + js
n=3
会给出
012
123
234
答案 1 :(得分:1)
如果你正在编写循环来解决数组问题,那么你通常做错了。只需使用上三角矩阵。
($3==6411 || $3==6311)
答案 2 :(得分:0)
由于这是一个家庭作业,我不会给你完整的答案,但我会给你一个足够的小费,让你去。
当你拥有所有这些数字时,可以考虑将它们放入np.array中,这样你就可以使用np.reshape(verctor,[lines,columns])。这是指向Numpy documentation的链接。
答案 3 :(得分:0)
有几种方法可以做到这一点:
也许最简单的方法是使用slicings和list comprehensions
def myfunc(n):
x = range(1, n+1)
return np.asarray([x[1:i+1][::-1] + x[:n-i] for i in range(n)])
你也可以使用类似Matlab的函数diag和transpose
def myfunc(n):
x = np.diag(np.ones(n))
for i in range(2, n+1):
d = np.diag(i*np.ones(n-i+1), i-1)
x += d + d.T
return x
基于循环的解决方案 - 正如@ GoBrewers14正确指出的那样 - 但是创建大型数组效率很低。在这种情况下,您应该使用矢量化算法。如果您不希望使用其他答案中建议的SciPy的toeplitz
和circulant
函数,broadcasting就是您的朋友。
def myfunc(n):
x = np.arange(n).reshape((1, n))
return np.abs(x - x.T) + 1
这就是你通过运行上述任何实现得到的结果:
>>> myfunc(6)
array([[1, 2, 3, 4, 5, 6],
[2, 1, 2, 3, 4, 5],
[3, 2, 1, 2, 3, 4],
[4, 3, 2, 1, 2, 3],
[5, 4, 3, 2, 1, 2],
[6, 5, 4, 3, 2, 1]])
希望这有帮助
答案 4 :(得分:0)
这可能不是你可以用来做作业的答案,但是......
In [619]: from scipy.linalg import toeplitz
In [620]: toeplitz(range(1, 7))
Out[620]:
array([[1, 2, 3, 4, 5, 6],
[2, 1, 2, 3, 4, 5],
[3, 2, 1, 2, 3, 4],
[4, 3, 2, 1, 2, 3],
[5, 4, 3, 2, 1, 2],
[6, 5, 4, 3, 2, 1]])
有关详细信息,请参阅documentation for scipy.linalg.toeplitz
。