数组中的数组,子数组和合并子数组

时间:2017-06-26 12:47:49

标签: python numpy for-loop append concatenation

我正在尝试制作一个包含三维数组(numpy)的列表。

我有这个脚本:

for a in range(0, (len(s[1]))):
    object_location = s[1][a]
    object.append(object_location)

(其中s [1]是数组s [x]列表中的一个坐标数组,如下所示:

S [1]:

array([[ 157.8,    7.7],
       [ 368.3,    5.9],
       [ 416.3,   13.9]
       ..)

上面的for循环创建了以下内容:

[array([ 157.8,    7.7]), array([ 368.3,    5.9]), array([ 416.3,   13.9])]     

我想在这个二维数组列表中添加第三个维,如下所示:

[array([ 157.8,    7.7], [122.7,    6.9], [67.4,    2.5]), array([ 368.3,    5.9], [296.2,    4.1], [62.3,    1.7]), array([ 416.3,   13.9],[542.9,    4.5], [64.2,    1.5])]     

对于每一个,在我的第一个脚本中创建一个对象[a]。 使用append或concatenate之类的东西,我想为此添加不同x'的值(所以在列表中创建上面的三维数组,但是如何?简单的追加或连接不起作用,因为(连接):数组没有相同数量的维。对于追加,它会失去分组的二维object_locations的分离(所以它会给出像数组([120,14,15,19]),[70,80, 90,100])

到目前为止,我已经创建了以下脚本:

for a in range(0, (len(s[1]))):
    object_location = s[1][a]
    object.append(object_location)

for x in sections:
    for a in range(0, (len(s[x]))-1):
        if x < (len(sections)):
            nearest_value = [s[x+1][spatial.KDTree(s[x+1]).query(s[x][a])[1]]]
            object[a].append(nearest_value)

这个脚本的问题在于它为最后一行说'numpy.ndarray'对象没有属性'append'。

编辑: 在我的脚本中的第一个循环之后,对象给出: [array([157.8,7.7]),array([368.3,5.9]),array([416.3,13.9])...],所以带有数组的列表。对于每个单独的数组,我想要包含s [x + 1]部分的坐标,并循环我所有的x'。

第二次编辑:

生成以下数组列表后:

for b in range(0,20):
     print(len(axon[b]))
     np.squeeze(axon[b])

我获得了这样一个列表:

3
array([array([ 157.8,    7.7]), [array([ 117.4,   17.9])],
   [array([ 363.3,    6.1])]], dtype=object)
3
array([array([ 368.3,    5.9]), [array([ 364.8,    6.1])],
   [array([ 444.1,   13.4])]], dtype=object)

..等等

在此范围的“np.concatenate”中,它仍然显示我的尺寸不同,而它应该在此范围内,对吧?它们都是数组中的数组,我想将其转换为例如:

'正确的数组':

array([368.3, 5.9]), [364.8, 6.1], [444.1, 13.4])

为什么np.concatenate / np.asarray仍然无法执行此操作?

但是,我在某些地方使用()而不是[]获得了以下内容,并使用extend作为添加到数组中的值:

[array([ 368.3,    5.9]), 364.80000000000001, 6.0999999999999996,     444.10000000000002, 13.4]

虽然我想要追加的值是以下形式,但当我使用'append'时它们仍然作为数组添加:

[117.4 17.9] [364.8 6.1]

有没有办法将其正确转换为上面的“正确数组”?

谢谢!

1 个答案:

答案 0 :(得分:0)

经过一些澄清后,我相信这就是你想要的:

object.append([object_location])

首先,我认为你在列表和数组之间有点混淆。他们相似,但有点不同。在python中,数组被称为列表。在numpy中,它们是数组。你现在正在做的只是将一堆1D numpy数组插入到列表中,看起来有点像这样:

[array([3, 3]), array([2, 3]), array([0, 1])]

现在,如果您尝试追加某些内容,比如元素0,那么您将获得

AttributeError: 'numpy.ndarray' object has no attribute 'append'

因为numpy数组无法附加到列表的方式(它们的大小固定)。

您想要的是将每个数组放入另一个列表中,如下所示:

[[array([3, 3])], [array([2, 3])], [array([0, 1])]]

(注意每个数组周围的额外[...]

现在,当你尝试追加第0个内部列表时,你会得到这样的结果:

[[array([3, 3]), array([4, 1])], [array([2, 3])], [array([0, 1])]]

请注意,您已成功将另一个1D阵列附加到第一个阵列。

如果所有内部列表都具有相同的维度,则可以使用np.asarray(your_list)将其转换为3D数组(而不是数组列表列表):

[[[3 3]
  [4 1]]

 [[2 3]
  [3 4]]

 [[0 1]
  [2 0]]]