【问题标题】:How to change the value in the array in each iteration?如何在每次迭代中更改数组中的值?
【发布时间】:2021-05-08 19:57:02
【问题描述】:

我有不同大小的矩阵,我尝试在每次迭代中增加每一行的值。

我设法增加了每一行的值,但是当迭代移动到下一个矩阵时,它只会增加前一个矩阵第一行的值 我需要它从矩阵的最后一行开始

有没有办法把前一个矩阵的最后一次迭代保存下来,在下一个矩阵中继续迭代?

这是我迭代数组的代码部分

c1=c1 + 10 * (np.arange(c1.shape[1]) + 1)*p
p +=1

我的结果

#first iteration
11 12 13 
21 22 23   
#second iteration
21 22 23 
41 42 43 
61 62 63   
#third iteration    
31 32 33 
61 62 63  

我需要

11 12 13 
21 22 23   

31 32 33 
41 42 43 
51 52 53   

61 62 63 
71 72 63

这是我从文本文件中读取输入的完​​整代码

demofile.txt

>=2 1 2 3 
>=3 1 2 3 
>=2 1 2 3

完整代码

import os
import sys
import numpy as np
import re

f = open("demofile.txt", "r")
lines = f.readlines()
p=1
#sys.stdout = open("results.txt", "w")
for i in list(lines):
     if i[0] != '<' and i[0] != '>' and i[0] != '=':# change txt file for np.array
        p = str(' '.join(i.split())) 
        print(p)
        
     else:
        w = i[3:]
        frst=i[2]
        w = ', '.join(w.split())
        y = i[2]
        y=int(y)+1
        #INSERT input to array
        c=np.array([w])
        c1 = [int(i) for i in c[0].replace(" ", "").split(",")]

        frst=str(frst).replace("[",'')
        frst=str(frst).replace("]",'')
        frst=int(frst)
        c1=np.array(c1)        

        sest2=c1
        c1=np.array([c1]*frst) #frst is the first value by which the matrix is multiplied
        c1=np.transpose(c1)#transpose
        

        #change value every iteration
        c1=c1 + 10 * (np.arange(c1.shape[1]) + 1)*p
        left=c1*-1
        sedem=np.transpose(left)*-1 #transpose matrix
        p +=1
       
        #editing outputs
        sedem=str(sedem).replace("[",'')
        sedem=str(sedem).replace("]",' 0')
        sedem=str(sedem).replace(".",'')
        sedem = sedem[:-1]
        sedem=str(sedem).replace("\n ",'\n')
        sedem=str(sedem).replace("  ",' ')
        sedem=str(sedem).replace("\n ",'\n')
        sedem=str(sedem).lstrip()       
        print(sedem,'\n')

【问题讨论】:

  • 你的输入数组是什么?
  • 输入数组是 c1,它从 demophile 中获取每行的最后三个数字,并迭代地遍历每一行。在这种情况下,第一个数组是 c1 = np.array ([1,2,3])。这乘以 demofile.txt 中的第一个目标来调整数组的大小
  • 你的输出应该是一个二维数组吗?
  • 对于二维数组的每次迭代,因为它在所需的输出中

标签: python arrays numpy for-loop


【解决方案1】:

试试这个:

        #change value every iteration
        c1 = np.array([[(p + j) * 10 for j in range(frst)]] * 3) + c1
        left=c1*-1
        sedem=np.transpose(left)*-1 #transpose matrix
        p += frst

您跟踪p 步进frst 并根据p 制作一个10 倍数的元素矩阵。

例如,如果p == 3,矩阵将是

[[30 40 50]
 [30 40 50]
 [30 40 50]]

【讨论】:

    【解决方案2】:

    让我们尝试将其与更多使用 numpy 的方法联系起来以解决问题。仅使用迭代器将上述数组分解为每个输入的块。

    您可以轻松地修改代码以将输入从 txt 文件获取到 numpy 数组,这样文本中的每一行都是数组中的单行。

    #Setup each row in text file as a row in a np matrix
    
    arr = np.array([[2,1,2,3],
                    [3,1,2,3],
                    [2,1,2,3]])
    
    print('INPUT:')
    print(arr)
    print('')
    
    ones = np.repeat(arr[:,1:], arr[:,0], axis=0)
    tens = (np.arange(1,arr[:,0].sum()+1)*10)
    nums = ones+tens[:, None]
    
    print('nums:')
    print(nums)
    print('')
    
    #Splitting nums for each input
    l = np.cumsum([0]+list(arr[:,0]))
    chunks = [nums[i:j,:] for i,j in zip(l,l[1:])]
    
    print('OUTPUT:')
    for i,chunk in enumerate(chunks):
        print('chunk number',i,':')
        print(chunk)
        print('')
    
    INPUT:
    [[2 1 2 3]
     [3 1 2 3]
     [2 1 2 3]]
    
    nums:
    [[11 12 13]
     [21 22 23]
     [31 32 33]
     [41 42 43]
     [51 52 53]
     [61 62 63]
     [71 72 73]]
    
    OUTPUT:
    chunk number 0 :
    [[11 12 13]
     [21 22 23]]
    
    chunk number 1 :
    [[31 32 33]
     [41 42 43]
     [51 52 53]]
    
    chunk number 2 :
    [[61 62 63]
     [71 72 73]]
    

    【讨论】:

      猜你喜欢
      • 2019-11-29
      • 2019-07-18
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      相关资源
      最近更新 更多