假設我有一個 3D numpy 陣列 A,如下所示:
A = np.array( [[[1,2,3], [4,5,6]] , [[7,8,9] , [10,11,12], [13,14,15]] ] , ndmin = 3 )
關于 A 唯一給出的是它是一個 3D 陣列,它是任意數量的 2D 陣列的陣列,其中每個 2D 陣列是任意數量的 1D 陣列的陣列,并且每個 1D 陣列正好有 3 個元素。
我想從這個 3D 陣列中洗掉每個 1D 陣列的中間元素,基本上得到新的陣列 A1,洗掉的列如下所示:
A1 = np.array( [[[1,3], [4,6]] , [[7,9] , [10,12], [13,15]] ] , ndmin = 3 )
X = np.array( [ [[2],[5]], [[8],[11],[14]] ], ndmin = 3 )
我想寫一個給定A的函式,它輸出(A1,X)和另一個給定(A1,X)輸出A的函式。我相信應該可以通過陣列切片撰寫第一個函式,但我不能這樣做。另外我該如何撰寫第二個函式。
uj5u.com熱心網友回復:
對于您參差不齊的陣列,最好將 np.arrays 存盤在形狀為 n 乘 3 的串列中:
A = [np.array([[1,2,3],
[4,5,6]]) ,
np.array([[7,8,9],
[10,11,12],
[13,14,15]])]
現在你可以:
def remove_middle(arr):
x = [a[:, 1] for a in arr]
arr_new = [np.delete(a, 1, axis = 1) for a in arr]
return arr_new, x
def insert_middle(arr, x):
return [np.concatenate([a[:, :1], xx.reshape(-1, 1), a[:, 1:]], axis = 1) for a, xx in zip(arr, x)]
remove_middle(A)
([array([[1, 3],
[4, 6]]),
array([[ 7, 9],
[10, 12],
[13, 15]])],
[array([2, 5]), array([ 8, 11, 14])])
insert_middle(*remove_middle(A))
# gets back the original A
[array([[1, 2, 3],
[4, 5, 6]]),
array([[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15]])]
uj5u.com熱心網友回復:
如果沒有 ndmin=3 引數,我可以使用兩個嵌套串列理解來解決您的答案,其中第一個索引中間引數,第二個洗掉內部陣列的中間引數。
import numpy
A = np.array([[[1,2,3], [4,5,6]] , [[7,8,9] , [10,11,12], [13,14,15]]])
middle = [[array1d[1] for array1d in array2d] for array2d in A]
without_middle = [[np.delete(array1d, 1) for array1d in array2d] for array2d in A]
uj5u.com熱心網友回復:
有了你奇怪的資料,這個看起來很荒謬的五元嵌套串列理解是我能想到的最好的:P
A1 = [[[[[e for i, e in enumerate(d) if i != 1] for d in c] for c in b] for b in a] for a in A]
X = [[[[[e for i, e in enumerate(d) if i == 1] for d in c] for c in b] for b in a] for a in A]
輸出:
>>> A1
[[[[[1, 3], [4, 6]], [[7, 9], [10, 12], [13, 15]]]]]
>>> X
[[[[[2], [5]], [[8], [11], [14]]]]]
uj5u.com熱心網友回復:
這是一個解決方案。請注意,串列作為原始 python 串列回傳,您可以根據需要使用它。
我將您對 A 的定義更改為更合適的物件。
import numpy as np
def f(A):
A1 = A.tolist()
X = []
for i in range(len(A1)):
temp = []
for j in range(len(A1[i])):
temp.append([A1[i][j].pop(1)])
X.append(temp)
return (A1, X)
def g(A1, X):
A = A1
for i in range(len(A1)):
for j in range(len(A1[i])):
A[i][j].insert(1, X[i][j][0])
return A
def main():
#A = np.array( [ [ [1,2,3], [4,5,6] ] , [ [7,8,9] , [10,11,12], [13,14,15] ] ] , ndmin = 3 )
A = np.asarray([ [ [1,2,3], [4,5,6] ] , [ [7,8,9] , [10,11,12], [13,14,15] ] ])
B, X = f(A)
print(g(B,X))
if __name__ == '__main__':
main()
最后請注意,這是許多可能的替代方案中的一種解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/449881.html
