Python numpy.tile不能像Matlab repmat那样工作
根据,我尝试使用python从3x3数组构建3x5数组 在Matlab中,这项工作正如我所期望的那样Python numpy.tile不能像Matlab repmat那样工作,python,matlab,numpy,equivalent,Python,Matlab,Numpy,Equivalent,根据,我尝试使用python从3x3数组构建3x5数组 在Matlab中,这项工作正如我所期望的那样 a = [1,1,1;1,2,1;1,1,1]; a_= repmat(a,[1,1,5]); 尺寸(a_)=3 5 但是对于numpy.tile b = numpy.array([[1,1,1],[1,2,1],[1,1,1]]) b_ = numpy.tile(b, [1,1,5]) 形状=(1,3,15) 如果我想生成与Matlab中相同的数组,那么等价的是什么 编辑1 我希望得到的结
a = [1,1,1;1,2,1;1,1,1];
a_= repmat(a,[1,1,5]);
尺寸(a_)=3 5
但是对于numpy.tile
b = numpy.array([[1,1,1],[1,2,1],[1,1,1]])
b_ = numpy.tile(b, [1,1,5])
形状=(1,3,15)
如果我想生成与Matlab中相同的数组,那么等价的是什么
编辑1
我希望得到的结果是
b_(:,:,1) =
1 1 1
1 2 1
1 1 1
b_(:,:,2) =
1 1 1
1 2 1
1 1 1
b_(:,:,3) =
1 1 1
1 2 1
1 1 1
b_(:,:,4) =
1 1 1
1 2 1
1 1 1
b_(:,:,5) =
1 1 1
1 2 1
1 1 1
但是@farenorth和numpy.dstack
给出的是什么
[[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
[[1 1 1 1 1]
[2 2 2 2 2]
[1 1 1 1 1]]
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]]
NumPy函数通常不是matlab函数的“插入式”替代品。通常情况下,“等效”函数的使用方式存在细微差异。适应确实需要时间,但我发现这种转变非常值得 在这种情况下,
np.tile
文档指出当您试图将数组平铺到比定义的维度更高的维度时会发生什么情况
numpy.tile(A,重复)
通过按代表给定的次数重复一个数组来构造数组
如果reps的长度为d,则结果的维度为max(d,A.ndim)
如果A.ndim[1,3,3]
的形状,然后平铺。因此,要获得所需的行为,只需确保在需要的数组中附加一个新的单例维度
>>> b_ = numpy.tile(b[..., None], [1, 1, 5])
>>> print(b_.shape)
(3, 3, 5)
请注意,我在这里使用了None
(即np.newaxis
)和省略号符号来指定数组末尾的新维度。您可以了解有关这些功能的更多信息
受OP评论启发的另一个选择是:
b_ = np.dstack((b, ) * 5)
在本例中,我使用元组乘法来“repmat”数组,然后由构造
正如@hpaulj所指出的,Matlab和NumPy显示矩阵的方式不同。要复制Matlab输出,可以执行以下操作:
>>> for idx in xrange(b_.shape[2]):
... print 'b_[:, :, {}] = \n{}\n'.format(idx, str(b_[:, :, idx]))
...
b_[:, :, 0] =
[[1 1 1]
[1 2 1]
[1 1 1]]
b_[:, :, 1] =
[[1 1 1]
[1 2 1]
[1 1 1]]
b_[:, :, 2] =
[[1 1 1]
[1 2 1]
[1 1 1]]
b_[:, :, 3] =
[[1 1 1]
[1 2 1]
[1 1 1]]
b_[:, :, 4] =
[[1 1 1]
[1 2 1]
[1 1 1]]
祝你好运 NumPy函数通常不是matlab函数的“插入式”替代品。通常情况下,“等效”函数的使用方式存在细微差异。适应确实需要时间,但我发现这种转变非常值得 在这种情况下,
np.tile
文档指出当您试图将数组平铺到比定义的维度更高的维度时会发生什么情况
numpy.tile(A,重复)
通过按代表给定的次数重复一个数组来构造数组
如果reps的长度为d,则结果的维度为max(d,A.ndim)
如果A.ndim[1,3,3]
的形状,然后平铺。因此,要获得所需的行为,只需确保在需要的数组中附加一个新的单例维度
>>> b_ = numpy.tile(b[..., None], [1, 1, 5])
>>> print(b_.shape)
(3, 3, 5)
请注意,我在这里使用了None
(即np.newaxis
)和省略号符号来指定数组末尾的新维度。您可以了解有关这些功能的更多信息
受OP评论启发的另一个选择是:
b_ = np.dstack((b, ) * 5)
在本例中,我使用元组乘法来“repmat”数组,然后由构造
正如@hpaulj所指出的,Matlab和NumPy显示矩阵的方式不同。要复制Matlab输出,可以执行以下操作:
>>> for idx in xrange(b_.shape[2]):
... print 'b_[:, :, {}] = \n{}\n'.format(idx, str(b_[:, :, idx]))
...
b_[:, :, 0] =
[[1 1 1]
[1 2 1]
[1 1 1]]
b_[:, :, 1] =
[[1 1 1]
[1 2 1]
[1 1 1]]
b_[:, :, 2] =
[[1 1 1]
[1 2 1]
[1 1 1]]
b_[:, :, 3] =
[[1 1 1]
[1 2 1]
[1 1 1]]
b_[:, :, 4] =
[[1 1 1]
[1 2 1]
[1 1 1]]
祝你好运 让我们尝试比较,注意使形状和值多样化
octave:7> a=reshape(0:11,3,4)
a =
0 3 6 9
1 4 7 10
2 5 8 11
octave:8> repmat(a,[1,1,2])
ans =
ans(:,:,1) =
0 3 6 9
1 4 7 10
2 5 8 11
ans(:,:,2) =
0 3 6 9
1 4 7 10
2 5 8 11
numpy等效值-或多或少:
In [61]: a=np.arange(12).reshape(3,4)
In [62]: np.tile(a,[2,1,1])
Out[62]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]])
再次使用numpy,但使用顺序F
,以更好地匹配MATLAB Fortran派生的布局
In [63]: a=np.arange(12).reshape(3,4,order='F')
In [64]: np.tile(a,[2,1,1])
Out[64]:
array([[[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]],
[[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]]])
我在开始时添加了新的numpy维度,因为在许多方面,它更好地复制了在最后添加它的MATLAB实践
尝试在末尾添加新尺寸标注。形状为(3,4,5),但您可能不喜欢显示
np.tile(a[:,:,None],[1,1,2])
另一个需要考虑的问题-当你把瓷砖弄平时会发生什么
octave:10> repmat(a,[1,1,2])(:).'
ans =
0 1 2 3 4 5 6 7 8 9 10 11
0 1 2 3 4 5 6 7 8 9 10 11
顺序为Fa
In [78]: np.tile(a[:,:,None],[1,1,2]).flatten()
Out[78]:
array([ 0, 0, 3, 3, 6, 6, 9, 9, 1, 1, 4, 4, 7, 7, 10, 10, 2,
2, 5, 5, 8, 8, 11, 11])
In [79]: np.tile(a,[2,1,1]).flatten()
Out[79]:
array([ 0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11, 0, 3, 6, 9, 1,
4, 7, 10, 2, 5, 8, 11])
对于C顺序数组:
In [80]: a=np.arange(12).reshape(3,4)
In [81]: np.tile(a,[2,1,1]).flatten()
Out[81]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11])
最后一个匹配八度布局
因此:
In [83]: a=np.arange(12).reshape(3,4,order='F')
In [84]: np.tile(a[:,:,None],[1,1,2]).flatten(order='F')
Out[84]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11])
困惑了吗?让我们尝试一下比较,注意使形状和值多样化
octave:7> a=reshape(0:11,3,4)
a =
0 3 6 9
1 4 7 10
2 5 8 11
octave:8> repmat(a,[1,1,2])
ans =
ans(:,:,1) =
0 3 6 9
1 4 7 10
2 5 8 11
ans(:,:,2) =
0 3 6 9
1 4 7 10
2 5 8 11
numpy等效值-或多或少:
In [61]: a=np.arange(12).reshape(3,4)
In [62]: np.tile(a,[2,1,1])
Out[62]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]])
再次使用numpy,但使用顺序F
,以更好地匹配MATLAB Fortran派生的布局
In [63]: a=np.arange(12).reshape(3,4,order='F')
In [64]: np.tile(a,[2,1,1])
Out[64]:
array([[[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]],
[[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]]])
我在开始时添加了新的numpy维度,因为在许多方面,它更好地复制了在最后添加它的MATLAB实践
尝试在末尾添加新尺寸标注。形状为(3,4,5),但您可能不喜欢显示
np.tile(a[:,:,None],[1,1,2])
另一个需要考虑的问题-当你把瓷砖弄平时会发生什么
octave:10> repmat(a,[1,1,2])(:).'
ans =
0 1 2 3 4 5 6 7 8 9 10 11
0 1 2 3 4 5 6 7 8 9 10 11
顺序为Fa
In [78]: np.tile(a[:,:,None],[1,1,2]).flatten()
Out[78]:
array([ 0, 0, 3, 3, 6, 6, 9, 9, 1, 1, 4, 4, 7, 7, 10, 10, 2,
2, 5, 5, 8, 8, 11, 11])
In [79]: np.tile(a,[2,1,1]).flatten()
Out[79]:
array([ 0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11, 0, 3, 6, 9, 1,
4, 7, 10, 2, 5, 8, 11])
对于C顺序数组:
In [80]: a=np.arange(12).reshape(3,4)
In [81]: np.tile(a,[2,1,1]).flatten()
Out[81]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11])
最后一个匹配八度布局
因此:
In [83]: a=np.arange(12).reshape(3,4,order='F')
In [84]: np.tile(a[:,:,None],[1,1,2]).flatten(order='F')
Out[84]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11])
困惑了吗?Hi@farenorth,这将生成不同的输出,类似于Matlab版本的numpy.dstack()。非常感谢。你的回答非常清楚和完整。对不起,我对Python numpy数组不太了解。没问题!我记得当我从Matlab切换时,您在这里提出的两个问题让我感到困惑。嗨@farenorth,这会生成不同的输出,类似于Matlab版本的numpy.dstack()。非常感谢。你的回答非常清楚和完整。对不起,我对Python numpy数组不太了解。没问题!我记得当我从Matlab切换到这里时,你在这里提出的两个问题让我感到困惑。
numpy.dstack((b,b,b,b,b,b),b))
提供了形状正确的奇怪输出。@farenorth
给了你正确的东西。