从下到上构建数组

时间:2015-03-29 02:01:48

标签: python arrays if-statement

好的,所以我试图在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循环中断,然后打印矩阵。谢谢!

3 个答案:

答案 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循环中提供了mwhile()的价值观,那么您根本不需要for循环 - 只需访问矩阵直接。