好的,所以我试图在python中从最后一行第一列构建一个数组,构建最后一行,然后转到第二行到最后一行第一列,依此类推。
换句话说:
首次迭代存储数据到(n = m = 1000值 - x是' store_data'):
- - - - -
- - - - -
- - - - -
- - - - -
x - - - -
下一次迭代将数据存储到(n = 1100,m = 1000 - x是' store_data'的值):
- - - - -
- - - - -
- - - - -
- - - - -
- x - - -
第6次迭代存储数据到(n = 1000,m = 1100 - x是' store_data'的值):
- - - - -
- - - - -
- - - - -
x - - - -
- - - - -
等等直到(n = 2000,m = 2000 - x是' store_data'的值)
- - - - x
- - - - -
- - - - -
- - - - -
- - - - -
存储位置的条件
n,m = 1000
while(1):
if m<2000 and n<2000
n=n+100
if m<2000 and n>=2000
m = m + 100
n=1000
if m>=2000 && n>=2000
m = 1000
n= 1000
因此,如果满足第一个条件,那么我想要变量值&#39; store_data&#39;在第一次迭代的地方。 if语句永远存在循环,而store_data在while循环的每次迭代中从传感器获取新值。换句话说:数组将是10 x 10,最后一行第一列将是&#39; store_data&#39;的值。当m,n = 1000时,第一行的最后一列将是&#39;存储数据的值。当m,n = 2000时。
天哪,我很难说清楚这一点。但我认为我想要的是清楚的。我必须添加什么代码才能将此数组构建到if语句中?
编辑:
好的,我现在有以下内容:
n=0 #row of matrix
m=0 #column of matrix
n_iteration = 10
m_iteration = 10
heat_map_reverse = [[0 for x in range(n_iteration)] for x in range(m_iteration)]
while(1): #loop forever
data = ser.read(4) # look for a character from serial port, will wait up to timeout above.
if len(data) == 4: #was there a byte to read? should always be true.
yvals = np.roll(yvals,-1) # shift the values in the array
yvals[49]=ord(data)
outFile.write(str(time()-start_time)+" "+str(yvals[49])+"\n") #write to file
line.set_ydata(yvals) # draw the line
fig.canvas.draw() # update the Canvas
win.set_title("Temp: "+str(yvals[49])+" deg C")
while gtk.events_pending(): #makes sure the GUI updates
gtk.main_iteration()
if m<m_iteration and n<n_iteration:
heat_map_reverse[n][m] = yvals[49]
n = n + 1
if m<m_iteration and n>=n_iteration:
m = m + 1
n = 0
if m>=m_iteration and n>=n_iteration:
m = 0
n= 0
break
print heat_map_reverse
但它永远不会打印heat_map_reverse! yvals [49]是我想要存储在矩阵中的值。我没有正确地摆脱while循环吗?在制作矩阵时,我有一个数据的图表 - 一旦完成,我希望它从while循环中断,然后打印矩阵。谢谢!
答案 0 :(得分:1)
为什么不正常构建列表,然后使用list.reverse()
或extended slice notation([::-1]
)反转它?
答案 1 :(得分:0)
您可以使用效率稍低的技巧,但这使得编码变得更加容易。
首先,请注意您感兴趣的对角线由m - n描述。也就是说,同一对角线上的所有点(m,n)具有相同的m-n值。
如果你的矩阵是2000平方,那么你想要的第一个对角线的值是1999 [(1999,0)在那个对角线上],最后一个对角线的值是-1999。 [(0,1999)就在那条对角线上]。
凭借这种洞察力,代码相对简单。这是一些代码,包括按迭代顺序填充正方形的示例。
def bottom_up(M):
for d in xrange(-M + 1, M):
for n in xrange(M):
m = n - d
if m < 0 or m >= M: continue
yield m, n
square = [['xxx'] * 5 for _ in xrange(5)]
for i, (m, n) in enumerate(bottom_up(5)):
square[m][n] = '%3d' % i
for line in square:
print ''.join(line)
一旦您获得了这样的代码,只需根据n
找到d
的正确范围,这样您就不需要了if
检查边界:
def bottom_up(M):
for d in xrange(-M + 1, M):
for n in xrange(max(0, d), min(M, M+d)):
yield n - d, n
根据原始代码,找到这些边界相对容易。你只需要解决n-d = 0和n-d = M,并使用max / min来确保n也保持在[0,M]范围内。
答案 2 :(得分:0)
我不确定我是否理解你正在尝试做什么 - 而且我也不是一个非常有经验的python程序员。但据我所知:Tere不是一个&#34;阵列&#34;在python中。
Python提供各种&#34;数据类型&#34;或&#34;数据结构&#34; (...不确定术语)来存储数据。
如果要将某些值存储在10 x 10矩阵中,并且只想通过索引访问它们,则可以使用嵌套列表。一个简单的例子(三行,十列):
matrix = [
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109],
[200, 201, 202, 203, 204, 205, 206, 207, 208, 209],
[300, 301, 302, 303, 304, 305, 306, 307, 308, 309]
]
您可以使用相应的循环以任何所需的方式迭代此矩阵。要向后迭代列表,请使用reversed()
:
for line in reversed(matrix):
for column in line:
print column # or any other command here
要构建这样的嵌套列表,您可以编写可以循环并向后插入值的内容 - 但您也可以简单地从头到尾构建列表,然后使用reversed()
。
我没有看到需要使用1000到2000的值进行迭代,看起来你只想存储一些数据&#34; x&#34;在正确的地方。为什么不使用简单的列表索引,从0到你需要的长度?
另外,它不可能存储1000到2000,步骤100的值,包括这个数字 - 在十个地方。您需要11个,或者您需要排除开始或结束号码。
如果您确实需要坚持使用这些数值,请改用词典:
matrix = {
1000 : {
1000: 'a1',
1100: 'b1',
1200: 'c1,
# etc.
},
1100 : {
1000: 'a2',
1100: 'b2',
1200: 'c2'
# etc.
},
# etc.
}
您可以构建它并像这样循环遍历:
# build empty matrix
matrix = {}
for line in range(1000, 2100, 100):
matrix[line] = {}
for column in range(1000, 2100, 100):
matrix[line][column] = ''
# loop that matrix from lines 2000 to 1000, columns from 1000 to 2000:
while True:
for line in range(2000, 900, -100):
for column in range(1000, 2100, 100):
matrix[line][column] = store_value # do something with the current cell
如果n
循环中提供了m
和while()
的价值观,那么您根本不需要for
循环 - 只需访问矩阵直接。