【问题标题】:Create new column for data after each iteration of a for loop in python在python中for循环的每次迭代后为数据创建新列
【发布时间】:2016-06-07 00:09:08
【问题描述】:

使用下一个代码,我想将结果放在不同 m 值的列中

import numpy as np 
for m in np.arange(0, 4, 1):
   for n in np.arange(1, 4, 1):
       coef = 2*m/n
       print coef

这样的结果是:

0
0
0
2
1
0
4
2
1
6
3
2

我想要这个

0 0 0
2 1 0
4 2 1
6 3 2

或者直接获取列,也就是行的值之和

0 + 0 + 0 = 0
2 + 1 + 0 = 3
4 + 2 + 1 = 7
6 + 3 + 2 = 11

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    在打印之后添加一个逗号,这样我们就不会在内循环之外添加换行符和另一个打印来分隔每一行:

    import numpy as np
    for m in np.arange(0, 4, 1):
       for n in np.arange(1, 4, 1):
           coef = 2*m/n
           print coef,
       print 
    

    这会给你:

    0 0 0
    2 1 0
    4 2 1
    6 3 2
    

    或者使用 print 作为函数:

    from __future__ import print_function
    
    
    import numpy as np
    
    for m in np.arange(0, 4, 1):
        print(*(2 * m / n for n in np.arange(1, 4, 1)))
    

    要得到总和,我们可以使用内置的 sum 函数,在内循环中使用 generator expression:

    import numpy as np
    
    for m in np.arange(0, 4, 1):
        print(sum(2 * m / n for n in np.arange(1, 4, 1)))
    

    这会给你:

    0
    3
    7
    11
    

    为了完整起见,与第一个示例等效的 print_function 代码将设置为 end=" ":

    from __future__ import print_function
    
    import numpy as np
    for m in np.arange(0, 4, 1):
       for n in np.arange(1, 4, 1):
           coef = 2*m/n
           print(coef, end=" ")
       print()
    

    【讨论】:

      【解决方案2】:

      正如我正确理解的那样,您希望在其列与您指定的一样的位置创建新数组。

      import numpy as np 
      a = np.zeros([3,4])
      for m in np.arange(0, 4, 1):
          col = []
          for n in np.arange(1, 4, 1):
              coef = int(2*m/n)
              col.append(coef)
          a[:, int(m)] = col
      
      print(a.T)
      

      【讨论】:

        【解决方案3】:

        您使用循环执行的操作与range 一样有效。无需使用numpy。

        但如果这是一个学习 numpy 的练习,我建议采用不同的方法。

        直接从范围中创建一个数组。 // 是整数除法。

        In [99]: A=2*np.arange(4)[:,None]//np.arange(1,4)
        
        In [100]: A
        Out[100]: 
        array([[0, 0, 0],
               [2, 1, 0],
               [4, 2, 1],
               [6, 3, 2]], dtype=int32)
        

        您可以使用数组方法跨列求和:

        In [101]: A.sum(axis=1)
        Out[101]: array([ 0,  3,  7, 11], dtype=int32)
        

        为了得到一个很好的格式,没有括号等,创建一个行格式化字符串:

        In [102]: fmt = '%d + %d + %d = %d'               
        
        In [103]: for row in A:                           
            print(fmt%(tuple(row)+(row.sum(),))) 
           .....:     
        0 + 0 + 0 = 0
        2 + 1 + 0 = 3
        4 + 2 + 1 = 7
        6 + 3 + 2 = 11
        

        (print的函数形式在Python3中正常,2.7可用)

        我可以通过np.savetxt 使用它的变体将其写入文件。

        In [104]: A.sum(axis=1,keepdims=True)  # sum in column array shape
        Out[104]: 
        array([[ 0],
               [ 3],
               [ 7],
               [11]], dtype=int32)
        
        In [105]: A1 = np.concatenate((A, A.sum(axis=1,keepdims=True)),axis=1)
        
        In [106]: A1     # the values and sum in one array
        Out[106]: 
        array([[ 0,  0,  0,  0],
               [ 2,  1,  0,  3],
               [ 4,  2,  1,  7],
               [ 6,  3,  2, 11]], dtype=int32)
        
        In [107]: np.savetxt('test.txt',A1,fmt=fmt)
        
        In [108]: cat test.txt    # look at the resulting file
        0 + 0 + 0 = 0
        2 + 1 + 0 = 3
        4 + 2 + 1 = 7
        6 + 3 + 2 = 11
        

        一个没有numpy的Python2.7版本:

        >>> for m in range(4):
        ...     row = [2*m/n for n in range(1,4)]
        ...     fmt = '%d + %d + %d = %d'
        ...     print fmt%(tuple(row)+(sum(row),))
        ... 
        0 + 0 + 0 = 0
        2 + 1 + 0 = 3
        4 + 2 + 1 = 7
        6 + 3 + 2 = 11
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多