我有一个多维矩阵(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)?
答案 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 numpy
。 cell2mat
与cell
一样,可以包含不同种类的对象,而list
具有统一的数字内容。