重複行在Python,假設我有一個1366×768 numpy的陣列。我想從它刪除每個第二行(第0行仍然存在,除去1,第2遺蹟,第3去除..等),並與這以前,這行重複(未刪除行)更換空的空間與此同時。刪除和numpy的陣列
是否有可能在numpy的?
重複行在Python,假設我有一個1366×768 numpy的陣列。我想從它刪除每個第二行(第0行仍然存在,除去1,第2遺蹟,第3去除..等),並與這以前,這行重複(未刪除行)更換空的空間與此同時。刪除和numpy的陣列
是否有可能在numpy的?
一種方法 -
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
看起來你具有偶數行的,在這種情況下,可以使用分配(分配奇數行中的值與對應偶數行):
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
這適用於偶數行和奇數行。
for i in range(1,len(a),2):
a[i] = a[i-1]
小艾高效就地分配。 – Divakar
@Divakar這可能是。儘管偶數行數組只有一種尷尬的工作。我會添加一些時間。 – Psidom
通過'strides'增加了另一種方法。 「大步」擊敗一個簡單的分配步驟實在太瘋狂了。 – Divakar