【问题标题】:Converting multidimensional array to tuple while conserving format- python在保存格式的同时将多维数组转换为元组-python
【发布时间】:2021-11-15 22:36:39
【问题描述】:

我正在尝试将具有不同格式的多维数组转换为元组,同时保留不同的格式。这是构建数组的代码

nodeData=np.empty((npoints*npoints,4))
ii=0
for i in range (npoints):
    for j in range (npoints):
        nodeData[ii,0]=int(ii+1)
        nodeData[ii,1]=float(X[i,j])
        nodeData[ii,2]=float(Y[i,j])
        nodeData[ii,3]=float(Z[i,j])
        ii+=1

哪个输出

[[  1.          10.           2.           0.        ]
 [  2.           9.23463314   1.84775906   0.        ]
 [  3.           8.58578682   1.41421354   0.        ]
 [  4.           8.15224103   0.76536686   0.        ]
 [  5.           8.           0.           0.        ]
 [  6.          10.           4.           0.        ]
 [  7.           8.14486726   3.94570562   0.        ]
 [  8.           6.43933982   3.56066012   0.        ]
 [  9.           6.05429438   1.8551327    0.        ]
 [ 10.           6.           0.           0.        ]
 [ 11.          10.           6.           0.        ]
 [ 12.           7.07624214   6.00295346   0.        ]
 [ 13.           4.29289317   5.70710671   0.        ]
 [ 14.           3.99704657   2.92375783   0.        ]
 [ 15.           4.           0.           0.        ]
 [ 16.          10.           8.           0.        ]
 [ 17.           6.02814844   8.02067549   0.        ]
 [ 18.           2.14644665   7.85355332   0.        ]
 [ 19.           1.97932457   3.97185155   0.        ]
 [ 20.           2.           0.           0.        ]
 [ 21.          10.          10.           0.        ]
 [ 22.           5.          10.           0.        ]
 [ 23.           0.          10.           0.        ]
 [ 24.           0.           5.           0.        ]
 [ 25.           0.           0.           0.        ]]

现在,当我尝试使用 nodeData = tuple(map(tuple, nodeData)) 将其转换为元组时,我得到了

((1.0, 10.0, 2.0, 0.0), (2.0, 9.234633143257458, 1.847759058732358, 0.0), (3.0, 8.5857868194580078, 1.4142135381698608, 0.0), (4.0, 8.1522410342120963, 0.76536686381751795, 0.0), (5.0, 8.0, 0.0, 0.0), (6.0, 10.0, 4.0, 0.0), (7.0, 8.144867260307727, 3.9457056195410947, 0.0), (8.0, 6.439339816570282, 3.5606601238250732, 0.0), (9.0, 6.0542943801670015, 1.8551327030961533, 0.0), (10.0, 6.0, 0.0, 0.0), (11.0, 10.0, 6.0, 0.0), (12.0, 7.0762421416553485, 6.0029534580819224, 0.0), (13.0, 4.2928931713104248, 5.7071067094802856, 0.0), (14.0, 3.997046571142258, 2.9237578279641867, 0.0), (15.0, 4.0, 0.0, 0.0), (16.0, 10.0, 8.0, 0.0), (17.0, 6.028148440014629, 8.0206754926510051, 0.0), (18.0, 2.1464466452598572, 7.8535533249378204, 0.0), (19.0, 1.9793245736169094, 3.9718515524632179, 0.0), (20.0, 2.0, 0.0, 0.0), (21.0, 10.0, 10.0, 0.0), (22.0, 5.0, 10.0, 0.0), (23.0, 0.0, 10.0, 0.0), (24.0, 0.0, 5.0, 0.0), (25.0, 0.0, 0.0, 0.0))

当我试图将每行的第一个值保存为整数时,它已将所有值转换为浮点数:

((1, 10.0, 2.0, 0.0),
 (2, 9.234633143257458, 1.847759058732358, 0.0), 
(3, 8.5857868194580078, 1.4142135381698608, 0.0), 
(4, 8.1522410342120963, 0.76536686381751795, 0.0), 
(5, 8.0, 0.0, 0.0), 
(6, 10.0, 4.0, 0.0), 
(7, 8.144867260307727, 3.9457056195410947, 0.0), 
(8, 6.439339816570282, 3.5606601238250732, 0.0), 
(9, 6.0542943801670015, 1.8551327030961533, 0.0), 
(10, 6.0, 0.0, 0.0), 
(11, 10.0, 6.0, 0.0), 
(12, 7.0762421416553485, 6.0029534580819224, 0.0), 
(13, 4.2928931713104248, 5.7071067094802856, 0.0), 
(14, 3.997046571142258, 2.9237578279641867, 0.0), 
(15, 4.0, 0.0, 0.0), 
(16, 10.0, 8.0, 0.0), 
(17, 6.028148440014629, 8.0206754926510051, 0.0), 
(18, 2.1464466452598572, 7.8535533249378204, 0.0), 
(19, 1.9793245736169094, 3.9718515524632179, 0.0), 
(20, 2.0, 0.0, 0.0), 
(21, 10.0, 10.0, 0.0), 
(22, 5.0, 10.0, 0.0), 
(23, 0.0, 10.0, 0.0), 
(24, 0.0, 5.0, 0.0), 
(25, 0.0, 0.0, 0.0))

或者,无论如何都可以在不构建数组的情况下获得最终结果,而是直接以正确的格式构建元组? 任何帮助将不胜感激。

【问题讨论】:

  • 它们不是“不同的格式”,numpy.ndarray 对象保存同质数据。您的 dtype 是浮点类型。您可以使用结构化数组。但是首先创建这个数组有什么意义呢?
  • 我需要元组来构建 abaqus 的输出数据库

标签: python arrays tuples


【解决方案1】:

您不能增量构建元组,因为元组是不可变的。但是你可以建立一个列表,然后将其转换为一个元组。

nodeData = []
ii = 1
for i in range (npoints):
    for j in range (npoints):
        nodeData.append((ii, float(X[i,j]), float(Y[i,j]), float(Z[i,j])))
        ii += 1
nodeData = tuple(nodeData)

【讨论】:

    【解决方案2】:

    当您第一次创建nodeData 数组时,您可以检查dtype 并注意该数组的类型为float64(请参阅下面的打印语句):

    npoints = 25
    nodeData=np.empty((npoints*npoints,4))
    print(nodeData.dtype)
    
    'float64'
    

    这意味着当您稍后分配整数时,它会自动转换为浮点数(参见下面的打印语句):

    npoints = 25
    nodeData=np.empty((npoints*npoints,4))
    ii=0
    for i in range (npoints):
        for j in range (npoints):
            nodeData[ii,0]=int(ii+1)
            print(nodeData[ii,0].dtype)
    
    'float64'...
    

    正如@barmar 建议的那样,您必须以一种不会将整数值转换为浮点数的方式构建一组元组(在 numpy 数组中设置值的方式将自动转换以匹配数组类型)。

    【讨论】:

      【解决方案3】:

      作为 Barmar 回答的替代方案,您还可以使用生成器:

      def generate():
          for i in range(npoints):
              for j in range(npoints):
                  yield (int(ii+1), float(X[i,j]), float(Y[i,j]), float(Z[i,j]))
                  ii += 1
      
      nodeData = tuple(generate())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 2020-04-24
        • 2020-11-19
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        相关资源
        最近更新 更多