删除并复制numpy数组中的行

时间:2017-04-25 13:59:24

标签: python numpy

在Python中,假设我有一个1366x768的numpy数组。我想删除它的第二行(第0行保留,第1行删除,第2行保留,第3行删除..等等),并用前面的行(未删除的行)替换空格在同一时间。

numpy有可能吗?

3 个答案:

答案 0 :(得分:3)

一种方法 -

a[::2].repeat(2,axis=0)

要在数组中进行更改,请将其重新分配。

示例运行 -

In [105]: a
Out[105]: 
array([[2, 5, 1, 1],
       [2, 0, 2, 5],
       [1, 1, 5, 7],
       [0, 7, 1, 8],
       [8, 5, 2, 3],
       [2, 1, 0, 6],
       [5, 6, 1, 6],
       [7, 1, 4, 7],
       [3, 8, 1, 4],
       [5, 8, 8, 8]])

In [106]: a[::2].repeat(2,axis=0)
Out[106]: 
array([[2, 5, 1, 1],
       [2, 5, 1, 1],
       [1, 1, 5, 7],
       [1, 1, 5, 7],
       [8, 5, 2, 3],
       [8, 5, 2, 3],
       [5, 6, 1, 6],
       [5, 6, 1, 6],
       [3, 8, 1, 4],
       [3, 8, 1, 4]])

如果我们关心性能,这是使用NumPy strides -

的另一种方法
def strided_app(a):
    m0,n0 = a.strides
    m,n = a.shape
    strided = np.lib.stride_tricks.as_strided
    return strided(a,shape=(m//2,2,n),strides=(2*m0,0,n0)).reshape(-1,n)

示例运行 -

In [154]: a
Out[154]: 
array([[4, 8, 7, 7],
       [5, 5, 1, 7],
       [1, 8, 1, 3],
       [6, 6, 5, 6],
       [0, 2, 6, 3],
       [6, 6, 8, 7],
       [7, 6, 8, 1],
       [7, 8, 8, 2],
       [4, 0, 2, 8],
       [5, 8, 1, 4]])

In [155]: strided_app(a)
Out[155]: 
array([[4, 8, 7, 7],
       [4, 8, 7, 7],
       [1, 8, 1, 3],
       [1, 8, 1, 3],
       [0, 2, 6, 3],
       [0, 2, 6, 3],
       [7, 6, 8, 1],
       [7, 6, 8, 1],
       [4, 0, 2, 8],
       [4, 0, 2, 8]])

计时 -

In [156]: arr = np.arange(1000000).reshape(1000, 1000)

# Proposed soln-1
In [157]: %timeit arr[::2].repeat(2,axis=0)
1000 loops, best of 3: 1.26 ms per loop

# @Psidom 's soln
In [158]: %timeit arr[1::2] = arr[::2]
1000 loops, best of 3: 928 µs per loop

In [159]: arr = np.arange(1000000).reshape(1000, 1000)

# Proposed soln-2
In [160]: %timeit strided_app(arr)
1000 loops, best of 3: 830 µs per loop

答案 1 :(得分:2)

看起来你有一个偶数行,在这种情况下,你可以使用赋值(将奇数行值分配给相应的偶数行):

arr = np.array([[1,4],[3,1],[2,3],[2,2]])
arr[1::2] = arr[::2]
arr
#array([[1, 4],
#       [1, 4],
#       [2, 3],
#       [2, 3]])

这可以避免复制整个数组,但如果数组的行数为奇数,则不起作用。

时间:这是时间的比较,分配似乎更快。

arr = np.arange(1000000).reshape(1000, 1000)

%timeit arr[::2].repeat(2,axis=0)
1000 loops, best of 3: 913 µs per loop

%timeit arr[1::2] = arr[::2]
1000 loops, best of 3: 655 µs per loop

答案 2 :(得分:0)

这适用于偶数行和奇数行。

for i in range(1,len(a),2):
    a[i] = a[i-1]