【问题标题】:Python: Doing Calculations on array elements in a listPython:对列表中的数组元素进行计算
【发布时间】:2017-05-09 09:15:13
【问题描述】:

我有一个数组列表,其中每个数组代表一个单元格,数组元素是坐标 x、y 和 z、时间点和单元格 ID。这是它的一部分:

cells=[   ..., 
   [ 264.847,  121.056,   30.868,   42.   ,  375.   ],
   [ 259.24 ,  116.875,   29.973,   43.   ,  375.   ],
   [ 260.757,  118.574,   32.772,   44.   ,  375.   ]]), array([[ 263.967,  154.089,   55.5  ,   38.   ,  376.   ],
   [ 260.744,  152.924,   55.5  ,   39.   ,  376.   ],
   [ 258.456,  151.373,   55.5  ,   40.   ,  376.   ],
   ..., 
   [ 259.086,  159.564,   48.521,   53.   ,  376.   ],
   [ 258.933,  159.796,   48.425,   54.   ,  376.   ],
   [ 259.621,  158.719,   51.606,   55.   ,  376.   ]]), array([[ 291.647,   57.582,   28.178,   38.   ,  377.   ],
   [ 284.625,   59.221,   30.028,   39.   ,  377.   ],
   [ 282.915,   59.37 ,   30.402,   40.   ,  377.   ],
   ..., 
   [ 271.224,   58.534,   23.166,   42.   ,  377.   ],
   [ 270.048,   58.738,   21.749,   43.   ,  377.   ],
   [ 268.38 ,   58.138,   20.606,   44.   ,  377.   ]]), array([[  87.83 ,  222.144,   26.258,   39.   ,  378.   ],
   [  99.779,  223.631,   24.98 ,   40.   ,  378.   ],
   [ 104.107,  224.177,   23.728,   41.   ,  378.   ],
   ..., 
   [ 127.778,  222.205,   23.123,   63.   ,  378.   ],
   [ 126.815,  222.347,   23.934,   64.   ,  378.   ],
   [ 127.824,  221.048,   25.508,   65.   ,  378.   ]]),...]

minimumCellCoors = cells
maximumCellCoors = cells
centoEdge = radius+fcr_size

现在我想改变坐标 x、y 和 z,所以 0.,1。和 2. 列表中数组的元素,以将它们放在特定的网格中。用户给出 x、y 和 z 的间距,然后操作可能如下所示:

 x_Coo=round(x_element/x)*x
 y_Coo=round(y_element/y)*y         
 z_Coo=round(z_element/z)*z

所以这里真正的问题是,我怎样才能对数组中的所有元素(或者在本例中为列表中数组中的前三个元素)进行操作?

编辑

如果我对列表使用列表理解,例如:

[np.round((cellID[:,0]-(centoEdge+1))/x)*x  for cellID in minimumCellCoors]
[np.round((cellID[:,1]-(centoEdge+1))/y)*y  for cellID in minimumCellCoors]
[np.round((cellID[:,2]-(centoEdge+1))/z)*z  for cellID in minimumCellCoors]

[np.round((cellID[:,0]+(centoEdge+1))/x)*x  for cellID in maximumCellCoors]
[np.round((cellID[:,1]+(centoEdge+1))/x)*y  for cellID in maximumCellCoors]
[np.round((cellID[:,2]+(centoEdge+1))/x)*z  for cellID in maximumCellCoors]

如何将单个数组列表再次融合到一个数组中?

最好的问候!

【问题讨论】:

  • 您能否提供一些有用的数据,这看起来与您的print 截断?

标签: arrays numpy math scipy


【解决方案1】:

首先,您需要将列表转换为 numpy 数组。首先创建一个 numpy 数组而不是列表更合适。然后你可以利用 numpy 的向量化操作支持:

这是一个例子:

In [45]: arr = np.arange(100).reshape(4, 5, 5)

In [46]: arr
Out[46]: 
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19],
        [20, 21, 22, 23, 24]],

       [[25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39],
        [40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49]],

       [[50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59],
        [60, 61, 62, 63, 64],
        [65, 66, 67, 68, 69],
        [70, 71, 72, 73, 74]],

       [[75, 76, 77, 78, 79],
        [80, 81, 82, 83, 84],
        [85, 86, 87, 88, 89],
        [90, 91, 92, 93, 94],
        [95, 96, 97, 98, 99]]])


In [51]: arr[:,:,:3] = np.round(arr[:,:,:3]/5)*5 

In [52]: arr
Out[52]: 
array([[[ 0,  0,  0,  3,  4],
        [ 5,  5,  5,  8,  9],
        [10, 10, 10, 13, 14],
        [15, 15, 15, 18, 19],
        [20, 20, 20, 23, 24]],

       [[25, 25, 25, 28, 29],
        [30, 30, 30, 33, 34],
        [35, 35, 35, 38, 39],
        [40, 40, 40, 43, 44],
        [45, 45, 45, 48, 49]],

       [[50, 50, 50, 53, 54],
        [55, 55, 55, 58, 59],
        [60, 60, 60, 63, 64],
        [65, 65, 65, 68, 69],
        [70, 70, 70, 73, 74]],

       [[75, 75, 75, 78, 79],
        [80, 80, 80, 83, 84],
        [85, 85, 85, 88, 89],
        [90, 90, 90, 93, 94],
        [95, 95, 95, 98, 99]]])

请注意,您还可以使用相同长度的数组和标量执行操作:

例如,您还可以执行以下操作:

In [53]: arr[:,:,:3] = np.round(arr[:,:,:3]/5)*[4, 5, 6]

【讨论】:

  • 好的,很好。但我该怎么做。会有两种可能。我有我的数据在一个数组中,但它没有为每个单元格拆分。我怎样才能做到这一点。我的方法是在新的单元格 ID 开始时创建一个数组列表,但这与您的答案相比似乎不是一个好主意。每当一个新的单元格 id 开始而不创建列表并直接获取数组的形状时,是否还有另一种可能性来拆分我的数组?
  • @Varlor 如果拆分没有返回一个偶数结果,您将无法执行此方法,并且您可能应该使用列表,并且可能使用列表理解以达到最佳水平更改前 3 项。
  • 好的,如果我使用列表理解,我怎么能在它之后将它们融合在一起,请参阅编辑:)
  • @Varlor 如果它们的大小不同,您可以通过将它们放入列表并传递给 np.array() 将它们转换为数组,但如果它们的形状相同,您可以使用np.concatenate() 沿特定轴连接它们。但是,如果它们的形状相同,您将使用 verctorized 配方;)
猜你喜欢
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 2018-08-26
  • 2016-03-27
  • 1970-01-01
  • 2018-09-02
  • 2017-01-11
  • 1970-01-01
相关资源
最近更新 更多