【问题标题】:2D and 1D numpy array in a for loop saving into filesfor循环中的2D和1D numpy数组保存到文件中
【发布时间】:2018-06-24 01:09:52
【问题描述】:

问题说明

给定两个 2D numpy 数组和一个 1D numpy 数组:

F =  np.array[[-3764.9303402755891, -3764.9303494098212, -3764.9304257856452, -3764.9306329129422], [-3764.9338022566421, -3764.9338129752682, -3764.9338970928361, -3764.9341184863633]]

T =  np.array[[ 10.,   30.1,  50.2,  70.3],
 [ 10.,   30.1,  50.2,  70.3]]

V =  np.array[ 226.331804,  228.817957]

我想生成 4 个文件:

# F_10.0K.dat:
226.331804   -3764.9303402755891
228.817957   -3764.9338022566421

# F_30.1K.dat:
226.331804    -3764.9303494098212
228.817957    -3764.9338129752682

# F_50.2K.dat:
226.331804    -3764.9304257856452
228.817957    -3764.9338970928361

# F_70.3K.dat:
226.331804     -3764.9306329129422
228.817957     -3764.9341184863633

我的尝试:

我注意到这两个切片操作:

print ' F_all[:,0] = ', F_all[:, 0]
print ' F_all[:,1] = ', F_all[:, 1]

返回:

 F_all[:,0] =  [-3764.93034028 -3764.93380226]
 F_all[:,1] =  [-3764.93034941 -3764.93381298]

这是前两个文件的第二列:F_10.0K.datF_30.1K.dat

所以,我可以循环了:

F_all_each_V_at_cte_T = []
for indx in range(0, cols):
   aux = F_all[:,indx]
   print ' F_all[:, indx] = ', F_all[:,indx]
   F_all_each_V_at_cte_T.append(aux)

print 'F_all_each_V_at_cte_T = ', F_all_each_V_at_cte_T

output_array = np.vstack((VOLUME_EACH, F_all_each_V_at_cte_T)).T
np.savetxt('F_vs_V_10.0K.dat', output_array, header="Volume    F at 10.0K", fmt="%0.13f")

结果是:

F_all_each_V_at_cte_T =  [array([-3764.93034028, -3764.93380226]), array([-3764.93034941, -3764.93381298]), array([-3764.93042579, -3764.93389709]), array([-3764.93063291, -3764.93411849])]

# Volume    F at 10.0K
226.3318040000000 -3764.9303402755891 -3764.9303494098212 -3764.9304257856452 -3764.9306329129422
228.8179570000000 -3764.9338022566421 -3764.9338129752682 -3764.9338970928361 -3764.9341184863633

这几乎实现了解决方案,但是,所有列都被打印了。如何生成上述文件?

【问题讨论】:

  • np.array[ 226.331804, 228.817957] 不是有效的 Python 语法

标签: python numpy for-loop multidimensional-array slice


【解决方案1】:

使用您的FV(我添加了 () 以生成有效的 Python 语句):

In [147]: F =  np.array([[-3764.9303402755891, -3764.9303494098212, -3764.930425
     ...: 7856452, -3764.9306329129422], [-3764.9338022566421, -3764.93381297526
     ...: 82, -3764.9338970928361, -3764.9341184863633]])
In [148]: V =  np.array([ 226.331804,  228.817957])
In [149]: F.shape
Out[149]: (2, 4)
In [150]: V.shape
Out[150]: (2,)

由于您的 F 值在小数点上有所不同,因此要弄清楚您希望如何配对值有点棘手。但这似乎是您想要的:

In [152]: for i in range(4):
     ...:     print(np.column_stack((V,F[:,i])))

[[  226.331804   -3764.93034028]
 [  228.817957   -3764.93380226]]
[[  226.331804   -3764.93034941]
 [  228.817957   -3764.93381298]]
[[  226.331804   -3764.93042579]
 [  228.817957   -3764.93389709]]
[[  226.331804   -3764.93063291]
 [  228.817957   -3764.93411849]]

这并没有显示所有的十进制值,但这只是一个默认的 numpy 显示问题。我使用column_stack 作为将两个一维数组连接为列的便捷方式。我也可以使用 stackconcatenate 并进行适当的尺寸调整。

savetxt做同样的事情:

In [153]: for i in range(4):
     ...:     np.savetxt('foo%s'%i,(np.column_stack((V,F[:,i]))))
     ...:     
In [154]: cat foo0
2.263318040000000053e+02 -3.764930340275589060e+03
2.288179570000000069e+02 -3.764933802256642139e+03
In [155]: cat foo1
2.263318040000000053e+02 -3.764930349409821247e+03
2.288179570000000069e+02 -3.764933812975268211e+03

这使用默认的savetxt 格式。你可以使用任何你喜欢的东西。

您可以改用T 值来创建文件名。 foo%s%T[0,i]`?

【讨论】:

  • 非常感谢您的回答。 np.column_stack 很棒。我一直在思考这个问题......请看我的回答,我想我已经设法通过循环来实现它。请随时评论我的方法,我们可以对其进行优化。
【解决方案2】:

为了更好的显示矩阵,可以使用pprint,如以下代码:

from pprint import pprint

pprint('your-matrix')

【讨论】:

    【解决方案3】:

    根据@hpaulj的回答:

    F =  np.array([[-3764.9303402755891, -3764.9303494098212, -3764.9304257856452, -3764.9306329129422], [-3764.9338022566421, -3764.9338129752682, -3764.9338970928361, -3764.9341184863633]])    
    V =  np.array([ 226.331804,  228.817957])
    T =  np.array([[ 10.,   30.1,  50.2,  70.3], [ 10.,   30.1,  50.2,  70.3]])
    
    for i in range(len(V)):
        np.savetxt('foo%s'%i,(np.column_stack((V, F[:,i]))))
    

    我认为这也可以使用以下循环来实现:

    rows = F_all.shape[0]
    cols = F_all.shape[1]
    
    cols_T = T.shape[1]
    rows_T = T.shape[0]
    
    for indx, t  in zip(range(0, cols), range(0, cols_T) ):
       aux_T = T[:,t]
       aux_F = F_all[:,indx]
    
       output_array = np.vstack((VOLUME_EACH, aux_F)).T
       np.savetxt('F_vs_V_%0.2fK.dat'  %aux_T[0], output_array, header="Volume           F at %0.2fK" %aux_T[0], fmt="%0.13f")
    

    如下图,生成的文件都是一样的:

    cat foo0

    2.263318040000000053e+02 -3.764930340275589060e+03
    2.288179570000000069e+02 -3.764933802256642139e+03
    

    cat foo1:

    2.263318040000000053e+02 -3.764930349409821247e+03
    2.288179570000000069e+02 -3.764933812975268211e+03
    

    cat F_vs_V_10.00K.dat:

    # Volume           F at 10.00K
    226.3318040000000 -3764.9303402755891
    228.8179570000000 -3764.9338022566421
    

    cat F_vs_V_30.10K.dat:

    # Volume           F at 30.10K
    226.3318040000000 -3764.9303494098212
    228.8179570000000 -3764.9338129752682
    

    【讨论】:

      猜你喜欢
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2020-10-03
      • 1970-01-01
      相关资源
      最近更新 更多