我有多個這樣的二維陣列,例如:
A = [[-1, -1, 0, 1, -1], [1, 1, 0, -1, -1], [-1, -1, -1, -1, -1], [-1, 1, -1, -1, 0]]
B = [[-1, -1, 0, 1, -1], [1, -1, 0, -1, -1], [0, 1, -1, 1, -1], [-1, 1, -1, -1, -1]]
C = [[0, -1, 0, 1, -1], [1, -1, 0, -1, -1], [0, 1, -1, 1, -1], [-1, 1, -1, -1, -1]]
D = [[-1, -1, 0, 1, 0], [0, 0, -1, 0, 1], [0, 1, -1, 1, -1], [-1, 1, -1, -1, -1]]
我需要在每個坐標中找到最頻繁的值,因此輸出將如下所示:
E = [[-1 -1 0 1 -1],[1 -1 0 -1 -1],[0 1 -1 1 -1],[-1 1 -1 -1 -1]]
我絕對可以遍歷這些陣列中的每一個,但我正在尋找一種矢量化的方法。元素數量約為 10-11,陣列尺寸約為 900X900。
是否可以使用串列理解來解決這個問題?
uj5u.com熱心網友回復:
使用串列推導會有點 Hacky。做了一些作業,但做到了。
基本上你必須使用嵌套的子串列理解,并且陣列必須具有相同的大小才能作業。
要使用矩陣,它只需要 1 個嵌套串列,但是當我們使用矩陣串列時,它將是 3 維的,因此需要 2 個嵌套子級。
我用來獲取最大價值的匯入模式。
from statistics import mode
A = [[-1, -1, 0, 1, -1], [1, 1, 0, -1, -1], [-1, -1, -1, -1, -1], [-1, 1, -1, -1, 0]]
B = [[-1, -1, 0, 1, -1], [1, -1, 0, -1, -1], [0, 1, -1, 1, -1], [-1, 1, -1, -1, -1]]
C = [[0, -1, 0, 1, -1], [1, -1, 0, -1, -1], [0, 1, -1, 1, -1], [-1, 1, -1, -1, -1]]
D = [[-1, -1, 0, 1, 0], [0, 0, -1, 0, 1], [0, 1, -1, 1, -1], [-1, 1, -1, -1, -1]]
matrixes = [A, B, C, D]
result = [[mode([x[k][j] for x in matrixes]) for j in range(len(matrixes[0][0]))] for k in range(len([x[0][0] for x in matrixes]))]
print(result)
結果:
[[-1, -1, 0, 1, -1], [1, -1, 0, -1, -1], [0, 1, -1, 1, -1], [-1, 1, -1, -1, -1]]
uj5u.com熱心網友回復:
您可以zip在所有陣列以及所有陣列的行和列的每個單元格中計算計數并找到最大值并保存最大值,如下所示:
import numpy as np
from collections import Counter
def cell_wise_cnt(arrs):
n_row = 0
res = np.empty((len(arrs[0]),len(arrs[0][0])))
for row in zip(*arrs):
arr = np.array(row)
num_col = len(arr[0])
for col in range(num_col):
res[n_row][col] = Counter(arr[:, col]).most_common()[0][0]
n_row = 1
return res
輸出:
>>> cell_wise_cnt(arrs = (A,B,C,D))
array([[-1., -1., 0., 1., -1.],
[ 1., -1., 0., -1., -1.],
[ 0., 1., -1., 1., -1.],
[-1., 1., -1., -1., -1.]])
colab的基準測驗:
%timeit cell_wise_cnt(arrs = (A,B,C,D))
# 136 μs per loop
% timeit scipy.stats.mode([A,B,C,D]).mode
# 585 μs per loop
%timeit stats.mode((A,B,C,D)*100_000).mode
# 1.73 s per loop
%timeit cell_wise_cnt(arrs = (A,B,C,D)*100_000)
# 2.38 s per loop
使用python 3.9和Julio_Lopes 的答案,我們可以獲得更好的 run_time。:
import statistics
def Julio_Lopes(arrs):
return [[statistics.mode(j) for j in zip(*i)] for i in zip(*arrs)]
%timeit Julio_Lopes(arrs = (A,B,C,D))
# 106 μs per loop
%timeit Julio_Lopes(arrs = (A,B,C,D)*100_000)
# 653 ms per loop
uj5u.com熱心網友回復:
正如@Michael Szczesny 所建議的那樣:您可以簡單地使用scipy.stats.mode:
from scipy import stats
arr = [A,B,C,D]
arr.mode(matrix)[0][0].tolist()
#output
[[-1, -1, 0, 1, -1],
[1, -1, 0, -1, -1],
[0, 1, -1, 1, -1],
[-1, 1, -1, -1, -1]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488937.html
標籤:Python 数组 麻木的 numpy-ndarray
上一篇:計算矩陣中相鄰元素的數量
下一篇:將兩個NumPy陣列合并為一個
