54

numpy ndarrayを「拡張」する良い方法はありますか?私がこのようなndarrayを持っているとしましょう:

[[1 2]
 [3 4]]

そして、ゼロを埋めることで、各行にさらに多くの要素を含める必要があります。

[[1 2 0 0 0]
 [3 4 0 0 0]]

これを行うには、ブルートフォース攻撃の方法がいくつかあるはずです(たとえば、ゼロを使用して大きな配列を作成し、古い小さな配列から要素をコピーするなど)。試しnumpy.reshapeましたが、機能しませんでした:

import numpy as np
a = np.array([[1, 2], [3, 4]])
np.reshape(a, (2, 5))

Numpyは次のように不平を言っています:ValueError: total size of new array must be unchanged

4

6 に答える 6

74

numpy.pad次のように使用できます。

>>> import numpy as np
>>> a=[[1,2],[3,4]]
>>> np.pad(a, ((0,0),(0,3)), mode='constant', constant_values=0)
array([[1, 2, 0, 0, 0],
       [3, 4, 0, 0, 0]])

ここでnp.padは、「配列aを取得して、その上に0行、下に0行、左側に0列、右側に3列を追加します。これらの列に「」でconstant指定された値を入力しますconstant_values

于 2014-08-07T03:43:20.010 に答える
54

インデックストリックr_とがありc_ます。

>>> import numpy as np
>>> a = np.array([[1, 2], [3, 4]])
>>> z = np.zeros((2, 3), dtype=a.dtype)
>>> np.c_[a, z]
array([[1, 2, 0, 0, 0],
       [3, 4, 0, 0, 0]])

これがパフォーマンスが重要なコードである場合はnp.concatenate、インデックスのトリックではなく、同等のコードを使用することをお勧めします。

>>> np.concatenate((a,z), axis=1)
array([[1, 2, 0, 0, 0],
       [3, 4, 0, 0, 0]])

ともありますがnp.resizenp.ndarray.resizeいくつかの制限があります(numpyがメモリにデータをレイアウトする方法のため)ので、それらのdocstringを読んでください。おそらく、単純に連結する方が良いことがわかるでしょう。

ちなみに、これを行う必要があるときは、通常、すでに述べた基本的な方法(ゼロの配列を作成し、その中に小さい配列を割り当てる)で行いますが、問題はありません。

于 2012-10-01T05:59:41.790 に答える
17

明確にするために、NumPy配列は拡張できないため、NumPy配列を拡張する「良い」方法はありません。配列が定義されると、その要素の数と各要素のサイズの組み合わせである、配列がメモリ内で占めるスペースは固定され、変更できなくなります。できることは、新しい配列を作成し、その要素の一部を元の配列の要素に置き換えることだけです。

np.concatenate便利な関数(関数とそのnp.*stackショートカットnp.column_stack、、インデックスルーチンnp.r_など)はたくさんありますがnp.c_、それだけです。便利な関数です。それらのいくつかは経営幹部レベルで最適化されています(np.concatenateそして他のものは私が思うに)、いくつかはそうではありません。

「手動で」(おそらくゼロで埋められた)大きな配列を作成し、それを自分で最初の配列で埋めるという最初の提案には、まったく何もないことに注意してください。より複雑なソリューションよりも読みやすいかもしれません。

于 2012-10-01T12:09:41.917 に答える
9

np.column_stackまたはを使用する必要がありますappend

import numpy as np

p = np.array([ [1,2] , [3,4] ])

p = np.column_stack( [ p , [ 0 , 0 ],[0,0] ] )

p
Out[277]: 
array([[1, 2, 0, 0],
       [3, 4, 0, 0]])

ただし、追加の方が速いようです。

timeit np.column_stack( [ p , [ 0 , 0 ],[0,0] ] )
10000 loops, best of 3: 61.8 us per loop

timeit np.append(p, [[0,0],[0,0]],1)
10000 loops, best of 3: 48 us per loop

そして、との比較np.c_[np.hstack追加はまだ最速のようです]:

In [295]: z=np.zeros((2, 2), dtype=a.dtype)

In [296]: timeit np.c_[a, z]
10000 loops, best of 3: 47.2 us per loop

In [297]: timeit np.append(p, z,1)
100000 loops, best of 3: 13.1 us per loop

In [305]: timeit np.hstack((p,z))
10000 loops, best of 3: 20.8 us per loop

そしてnp.concatenate[それは]よりも少し速いですappend

In [307]: timeit np.concatenate((p, z), axis=1)
100000 loops, best of 3: 11.6 us per loop
于 2012-10-01T05:56:01.897 に答える
8

簡単な方法:

# what you want to expand
x = np.ones((3, 3))

# expand to what shape 
target = np.zeros((6, 6))

# do expand
target[:x.shape[0], :x.shape[1]] = x

# print target
array([[ 1.,  1.,  1.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.]])

機能的な方法:

少し変更を加えて、https: //stackoverflow.com/a/35751427/1637673から借ります。

def pad(array, reference_shape, offsets=None):
    """
    array: Array to be padded
    reference_shape: tuple of size of narray to create
    offsets: list of offsets (number of elements must be equal to the dimension of the array)
    will throw a ValueError if offsets is too big and the reference_shape cannot handle the offsets
    """

    if not offsets:
        offsets = np.zeros(array.ndim, dtype=np.int32)

    # Create an array of zeros with the reference shape
    result = np.zeros(reference_shape, dtype=np.float32)
    # Create a list of slices from offset to offset + shape in each dimension
    insertHere = [slice(offsets[dim], offsets[dim] + array.shape[dim]) for dim in range(array.ndim)]
    # Insert the array in the result at the specified offsets
    result[insertHere] = array
    return result
于 2017-06-19T05:45:00.093 に答える
4

np.vstack、np.hstack、np.dstackのような同様のメソッドもあります。どの次元が「拡張」されているかが明確になるので、np.concatenteよりもこれらが好きです。

temp = np.array([[1, 2], [3, 4]])
np.hstack((temp, np.zeros((2,3))))

numpyの最初の軸が垂直であるためvstackが最初の軸を拡張し、2番目の軸が水平であるためhstackであるため、覚えやすいです。

于 2015-10-25T13:16:08.187 に答える