2

我有一段代码,我正在将其从 MATLAB 转换为 python。它还没有以非常 Pythonic 的方式编写,但我会在稍后阶段对其进行调整。

MATLAB 脚本具有vec2mat来自通信系统工具箱的功能。(参见http://www.mathworks.co.uk/help/comm/ref/vec2mat.html)这通过指定您希望转换的向量和您希望拥有的列数将向量更改为矩阵来工作. mat = vec2mat(vec,matcol).

我通常只会使用numpy.reshape. 但是,如果向量中没有足够的值来完全填充最后一行,则 vec2mat 会在最后一行添加零。

我需要的填充将根据我输入的 csv 文件而有所不同。

    atbmat = vec2mat(atbvec,nb);

在此示例中,casenb为 5,长度atbvec为 4806。因此,底部行添加了四个零。

我将如何在 python 中添加额外的零来创建二维数组?atbvec我将拥有长度为 4806 且nb等于 5的一维数组 (我想要 nb 列)。

感谢您的任何建议,我希望这是有道理的。

编辑

     dim=len(atbvec)/int(nb)
     atbvec=np.array(atbvec)
     atbvec=np.copy(atbvec)
     atb_mat=atbvec.resize((dim,nb)

这是回归None

4

2 回答 2

3

您可以使用对象的resize()方法numpy.ndarray

import numpy as np

a = np.array([1,2,3])
a.resize(2,3)
print a
#array([[1, 2, 3],
#       [0, 0, 0]])

编辑:

注意a是扩展in-place的,这意味着原来的数组现在有一个额外的、连续的内存块的引用。

在您的情况下,根据评论,您可以之前创建一个副本:

atb_mat = atbvec.copy()
atb_mat.resize(dim, nb)

或者,最好使用numpy.resize来获得一个没有引用的全新数组:

atb_mat = numpy.resize(atbvec, (dim, nb))

但是,在这种情况下,数组会填充来自 的先前值atbvec,例如:

a = np.array([1,2,3])
b = np.resize(a, (3, 4))
#array([[1, 2, 3, 1],
#       [2, 3, 1, 2],
#       [3, 1, 2, 3]])

看到内存块被复制,直到它填满新的连续大小。

于 2013-08-30T08:55:04.137 回答
1

压倒一切的编辑:似乎我误解了这个问题,并完全解决了另一个问题。下面的解决方案是,如果您需要将数组扩展或缩小到任意大小,必要时用零填充。

我不知道有一个功能可以按您的要求执行(尽管我一直在学习!)。我能想到的最简单的方法可能是使用numpy.pad. 只要新形状大于旧形状,以下函数就可以满足您的需求:

def vec2mat(a, new_shape):

    padding = (new_shape - numpy.vstack((new_shape, a.shape))).T.tolist()

    return numpy.pad(a, padding, mode='constant')

如果您需要处理比原始数组更小和更大的大小,则应执行以下操作:

def vec2mat(a, shape):

    padding = (shape - numpy.vstack((shape, a.shape))).T

    # Split into positive and negative padding
    neg_padding = padding.copy()
    neg_padding[neg_padding > 0] = 0
    padding[padding < 0] = 0

    # Turn the zero neg_paddings into None:
    slice_marks = [axis if axis[1] != 0 else (None,) for axis in neg_padding]

    # Make the slicer
    slicer = [slice(*each_mark) for each_mark in slice_marks]

    return numpy.pad(a[slicer], padding.tolist(), mode='constant')

请注意,上述两个函数都应该对任意维度数组进行操作。

编辑:resize作为解决方案的问题在于它仅在内存中扩展数组,然后有效地将新内存块重塑为您请求的大小。这样做的效果是,如果你试图沿着除了最短轴之外的任何轴进行扩展,你会遇到问题。考虑沿第一个轴扩展:

a = np.array([1,2,3]).copy()
a.resize(2, 3)
# array([[1, 2, 3],
#        [0, 0, 0]])

按预期工作。但是,现在考虑沿最后一个轴扩展:

a = np.array([[1],[2],[3]]).copy()
a.resize(3, 2)
# array([[1, 2],
#        [3, 0],
#        [0, 0]])

我认为这根本不是您想要的,但如果我错了,请纠正我。我的理解是,您需要一个数组,其中第一[[1],[2],[3]]列为全零,第二列全为零。

于 2013-08-30T09:29:15.567 回答