您好我的问题是关于下面的J.F. Sebastian代码和讨论。 我正在尝试打印数组的子数组。代码如下,我的更新位于底部。 (它提供错误消息)creating a spiral array in python?
我想基于此数组中的选定条目创建子数组。如果我们选择04条目,
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<form class="form-inline">
<div class="row">
<div class="col-xs-6 form-group">
<label>Label 1</label>
<input class="form-control" type="text" />
</div>
<div class="col-xs-6 form-group">
<label>Label 2</label>
<input class="form-control" type="text" />
</div>
</div>
</form>
但是由于没有正确定义子数组,我收到错误消息。我期待print_matrix(子阵列)产生
subarray[x][y] == 04
subarray[x][y] == TheSpiral[x-1:x+2,y-1:y+2]
print_matrix(TheSpiral)
print_matrix(subarray)
这就是我使用#TheSpiral [x-1:x + 2,y-1:y + 2]的原因。谢谢你的帮助。
答案 0 :(得分:2)
问题是第二片没有做你认为它做的事情
[][]
,但是...... 您可以使用列表解析来修复它:
>>> i, j = 3, 2
>>> subarray = [row[j-1:j+2] for row in TheSpiral[i-1:i+2]]
>>> print_matrix(subarray)
06 01 02
05 04 03
16 15 14
或者你可以使用numpy
(这可能是矫枉过正!!!)并使用你的原始语法:
>>> import numpy as np
>>> subarray = np.array(TheSpiral)[i-1:i+2,j-1:j+2]
>>> print_matrix(subarray)
06 01 02
05 04 03
16 15 14
计算螺旋坐标:
def spiral_coord(n):
k = int((n**0.5) // 2)
t = 2*k
m = (t+1)**2
for fn in (lambda: (-k, k-(m-n)), lambda: (-k+(m-n), -k), lambda: (k, -k+(m-n))):
if n >= m-t:
return fn()
m -= t
return k-(m-n-t), k
>>> mid = (5-1)//2
>>> i, j = map(lambda x: x+mid, spiral_coord(9))
>>> subarray = np.array(TheSpiral)[i-1:i+2,j-1:j+2]
>>> print_matrix(subarray)
23 24 25
08 09 10
01 02 11
答案 1 :(得分:1)
我相信您的子数组代码中存在语法错误。作为方法&#34;螺旋&#34;返回一个二维数组(在你的情况下是TheSpiral),访问二维数组元素的方式必须是
TheSpiral[i][j]
不
TheSpiral[i,j]