我正在尝试制作一个包含三维数组(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]
有没有办法将其正确转换为上面的“正确数组”?
谢谢!
答案 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]]]