将2维数组合并到现有的3维数组中

4
>>>d1.shape
>>>(18,18)
>>>d2.shape
>>>(18,18)
>>>d3 = array([d1, d2])
>>>d3.shape
>>>(2, 18, 18)  

如果我已经有了形状为(2,18,18)的d3数组,并且我想将另一个2-d数组d4(18x18)添加到d3中,以使其成为3-d数组(3,18,18)。我该怎么做?
====2015-12-31=====
总结
从下面的答案中,我收集了一些有用的代码
d3 = np.concatenate([d3, d4.reshape(1, d3.shape[0],d4.shape[1])])
d3 = np.vstack([d3, d4[None, ...]])
PS
在读取681个.csv文件构建3-d数组(681x50x60)的测试后,第二种方法比第一种方法更有效(在同一台笔记本电脑上分别为19秒和28秒)。

3
将您的新数组重新调整为(1,18,18),并使用http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.concatenate.html。 - Luis Masuelli
2
如果有选择的话,您也可以考虑沿第三个轴堆叠物品,而不是第一个轴。这样更符合numpy的广播方式,并且您将能够使用np.dstack来完成您正在进行的操作。 - Joe Kington
2个回答

5

与您对d3的操作相同,只需将d4重新塑造为一个三维数组:

d3 = array([d3, d4.reshape(1, 18, 18)])

或者

d3 = concatenate([d3, d4.reshape(1, 18, 18)])


2
顺便提一下,d4.reshape(1, 18, 18) 也可以写成 d4[None, ...] 或者 d4[np.newaxis, ...]Ellipsis 可以有效地填充其他维度而不需要知道它们的确切大小。使用 None 和/或 newaxis(它们是同一个对象)进行切片会添加一个新的单例维度。 - Joe Kington
这之后d3的形状是否正确,还是d3变成了两个NumPy数组的数组? - ilent2
@ilent2 在此之后,d3的形状为(3,18,18)。 - Zachi Shtain
@ZachiShtain 你使用的是哪个版本的numpy?能否发布一下重现结果的代码?也许我打错了... - ilent2
1
@ilent2 我正在使用numpy 1.9.0版本。 - Zachi Shtain

1
以下内容可能有用,但我想有更有效的方法实现相同的结果...
import numpy as np
d1 = np.array([[1, 2, 3], [4, 5, 6]])
d2 = np.array([[7, 8, 9], [1, 2, 3]])
d3 = np.array([d1, d2])

dnew = np.array([[6, 5, 4], [3, 2, 1]])
d3 = np.array([dnew] + [d3[a, ...] for a in range(d3.shape[0])])

# Add to the end of the array
dlast = np.array([[6, 5, 4], [3, 2, 1]])
d3 = np.array([d3[a, ...] for a in range(d3.shape[0])] + [dlast])

编辑:有更好的方法

这个问题中,stack命令被用来将数组直接堆叠在一起。例如:

import numpy as np
d1 = np.array([[1, 2, 3], [4, 5, 6]])
d2 = np.array([[7, 8, 9], [1, 2, 3]])
d3 = np.array([d1, d2])

dnew = np.array([[6, 5, 4], [3, 2, 1]])
d3 = np.vstack([d3, dnew[None, ...]])

使用np.vstack和仅使用np.array创建新数组之间存在重要区别。后者(在numpy版本1.8.2上测试)生成两个对象的数组,而堆栈则生成单个numpy数组。


我需要的是np.vstack。谢谢! - Han Zhengzu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接