web-dev-qa-db-ja.com

numpyはlist.popと同等ですか?

pythonリストの組み込みpopと同等のnumpyメソッドはありますか?

ポップは明らかにnumpy配列では機能しません。リストの変換は避けたいです。

14
Anton Alice

NumPy配列にはpopメソッドはありませんが、基本的なスライスを使用できます(コピーではなくビューを返すため効率的です)。

In [104]: y = np.arange(5); y
Out[105]: array([0, 1, 2, 3, 4])

In [106]: last, y = y[-1], y[:-1]

In [107]: last, y
Out[107]: (4, array([0, 1, 2, 3]))

popメソッドがある場合、lasty値を返し、yを変更します。

上記、

last, y = y[-1], y[:-1]

最後の値を変数lastに割り当て、yを変更します。

11
unutbu

numpy.delete() を使用した1つの例を次に示します。

import numpy as np
arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
print(arr)
#  array([[ 1,  2,  3,  4],
#         [ 5,  6,  7,  8],
#         [ 9, 10, 11, 12]])
arr = np.delete(arr, 1, 0)
print(arr)
# array([[ 1,  2,  3,  4],
#        [ 9, 10, 11, 12]])
6
mozlingyu

NumPy配列にはPopは存在しませんが、NumPyインデックス作成と配列の再構築(hstack/vstackまたはnumpy.delete()など)を組み合わせて使用​​して、ポップをエミュレートできます。

ここに私が考えることができるいくつかのサンプル関数があります(インデックスが-1のときは明らかに機能しませんが、単純な条件付きでこれを修正できます):

def poprow(my_array,pr):
    """ row popping in numpy arrays
    Input: my_array - NumPy array, pr: row index to pop out
    Output: [new_array,popped_row] """
    i = pr
    pop = my_array[i]
    new_array = np.vstack((my_array[:i],my_array[i+1:]))
    return [new_array,pop]

def popcol(my_array,pc):
    """ column popping in numpy arrays
    Input: my_array: NumPy array, pc: column index to pop out
    Output: [new_array,popped_col] """
    i = pc
    pop = my_array[:,i]
    new_array = np.hstack((my_array[:,:i],my_array[:,i+1:]))
    return [new_array,pop]

これは、ポップされた行/列のない配列と、ポップされた行/列を別々に返します:

>>> A = np.array([[1,2,3],[4,5,6]])
>>> [A,poparow] = poprow(A,0)
>>> poparow
array([1, 2, 3])

>>> A = np.array([[1,2,3],[4,5,6]])
>>> [A,popacol] = popcol(A,2)
>>> popacol
array([3, 6])
2
dbouz