2

MATLAB から python に変換するコードがあります。まだ非常にPython的な方法で書かれていませんが、後の段階で適応させます.

MATLAB スクリプトにはvec2mat、Communications systems ツールボックスの関数があります。( http://www.mathworks.co.uk/help/comm/ref/vec2mat.htmlを参照してください)これは、変換したいベクトルと必要な列の数を指定して、ベクトルを行列に変更することで機能します。 . mat = vec2mat(vec,matcol).

私は通常、単に使用しますnumpy.reshape。ただし、最後の行を完全に埋めるのに十分な値がベクトルにない場合、vec2mat は最後の行にゼロを追加します。

必要なパディングは、入力した csv ファイルによって異なります。

    atbmat = vec2mat(atbvec,nb);

この例の場合nbは 5 で、 の長さatbvecは 4806 です。したがって、4 つのゼロが一番下の行に追加されます。

2D 配列を作成するために Python で余分なゼロを追加するにはどうすればよいですか? atbvec長さ4806でnb5に等しい1D配列 があります(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が extendedであることに注意してください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]])

それはあなたが望んでいるものではないと思いますが、間違っている場合は修正してください。私の理解では、最初の列がすべてゼロで、2 番目の列がすべてゼロの配列が必要です[[1],[2],[3]]

于 2013-08-30T09:29:15.567 に答える