连接数组中的问题

时间:2019-02-01 16:11:54

标签: python arrays loops numpy concatenation

我有一个多维矩阵(10 * 59 * 2000),我想将10个试验连接成一个信号。最终矩阵应为(590 * 2000)。我尝试了几种方法。

当我使用以下代码时,出现错误:

M = np.array([])
for i in range(0, 10)):
    m1 = raw._data[i]
    M = np.concatenate(([M, m1]), axis = 0)
  

ValueError:所有输入数组的维数必须相同

当我使用其他建议Here的代码时,也会遇到相同的错误

M = np.empty((59, 2000))
for i in range(0, 10):
    m1 = raw._data[i]
    M = np.append(M, [m1], axis = 0)

但是当我将[m1]更改为m1时,我可以得到一个很好的结果,但是得到的不是(590 * 2000),而是(649 * 2000)那是我在数组中制作的一个空数组(59 * 2000)第一行添加到我的最终矩阵。

M = np.append(M, m1, axis = 0)

能否让我知道如何将这些数组连接成一个循环以创建目标数组(590 * 2000)?

2 个答案:

答案 0 :(得分:0)

我假设您的形状是10个试验,59个eeg通道和2000个时间点。

您希望将时间维度与最终形状59,20 * 2000连接起来。

np.concatenate(multi_trial, axis=1)
# or
np.hstack(multit_trial)

这是什么:在第一个轴上分割multi_trial(试验一个)。有了所有的阵列,每个试验一个(通道,时间)阵列,将它们沿第二个轴即时间轴粘合在一起。

答案 1 :(得分:0)

如果必须迭代连接:

urllib

In [84]: rdata = np.arange(24).reshape(4,3,2) In [85]: M = np.empty((0,2), int) ...: for i in range(4): ...: M = np.concatenate((M, rdata[i,:,:]),axis=0) ...: In [86]: M Out[86]: 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]])

rdata.reshape(12,2)

即使有这么小的样本,列表的追加速度也比数组连接快2倍以上。

我不必重复-只需传递In [89]: M = [] ...: for i in range(4): ...: M.append(rdata[i,:,:]) ...: M = np.concatenate(M, axis=0) 即可进行连接。它将3d数组视为2d数组的列表:

rdata

请注意,我使用np.concatenate(rdata, axis=0) 。关于concatenate,我不能说太多坏话。可以在1d数组的末尾添加标量是可以的,但是对于其他任何东西,它都很难使用,并且会以多种方式误导用户。 np.append接受了整个项目列表,concatenate仅接受了2。

append还有其他封面,它们以各自的方式有用。 concatenate也许是最好的。但是从长远来看,除非您了解如何操作尺寸并直接使用np.stack,否则您将不会使用“堆栈”权限。

MATLAB确实允许您逐步增加阵列。我怀疑尽管在后台它执行的操作与concatenate相同。 Python列表更好,因为它们不涉及副本。列表追加仅将指针添加到列表缓冲区,因此它既快速又简单。快速的网络搜索表明,即使在MATLAB中,也不鼓励动态增长矩阵。最建议您预先分配矩阵。

从列表连接的

numpy有点像MATLAB numpycell2matcell一样,可以包含不同种类的对象,而list具有统一的数字内容。