我有一個以下形式的陣列,其中前兩列應該是二維陣列的索引,以下列是任意值。
data = np.array([[ 0. , 1. , 48. , 4. ],
[ 1. , 2. , 44. , 4.4],
[ 1. , 1. , 34. , 2.3],
[ 0. , 2. , 55. , 2.2],
[ 0. , 0. , 42. , 2. ],
[ 1. , 0. , 22. , 1. ]])
如何將索引data[:,:2]與其值結合起來data[:,2:],以便前兩列中的索引可以訪問結果陣列。
在我的例子中,這將是:
result = np.array([[[42. , 2. ], [48. , 4. ], [55. , 2.2]],
[[22. , 1. ], [34. , 2.3], [44. , 4.4]]])
我知道有一個使用 python 回圈的簡單解決方案。但是性能是一個問題,因為我正在處理大量資料。具體來說,它是我需要處理的另一個程式的輸出。
也許還有一個相對簡單的 numpy 解決方案。但我有點卡住了。
如果有幫助,可以安全地假設以下內容:
- 前兩列中的所有數字都是整數(盡管陣列由浮點陣列成)。
- 原始陣列中的每個可能的索引(或者更確切地說是索引的組合)都只使用一次。即保證表格中只有一個條目
[i, j, ...]。 - 指數從 0 開始,我事先知道最高指數。
編輯:
唔。我現在看到我的例子是如何誤導的。事實是我的一些輸入陣列是排序的,但這是不可靠的。所以我不應該假設任何關于訂單的事情。我在示例中重新排序了一些行以使其更清晰。如果有人想理解下面的答案和評論:在我原來的問題中,陣列似乎是按前兩列排序的。
uj5u.com熱心網友回復:
find row, column, depthbase 你的資料陣列,然后填寫如下:
import numpy as np
data = np.array([[ 0. , 0. , 42. , 2. ],
[ 0. , 1. , 48. , 4. ],
[ 0. , 2. , 55. , 2.2],
[ 1. , 0. , 22. , 1. ],
[ 1. , 1. , 34. , 2.3],
[ 1. , 2. , 44. , 4.4]])
row = int(max(data[:,0])) 1
col = int(max(data[:,1])) 1
depth = len(data[0, 2:])
out = np.zeros([row, col, depth])
out = data[:, 2:].reshape(row,col,depth)
print(out)
輸出:
[[[42. 2. ]
[48. 4. ]
[55. 2.2]]
[[22. 1. ]
[34. 2.3]
[44. 4.4]]]
uj5u.com熱心網友回復:
您可以在 no-python 并行模式下使用帶有回圈的 numba(這本質上是用于 python 回圈加速),這將是評論中提到的
更一般地考慮超過 2 列:
@nb.njit("float64[:, :, ::1](float64[:, ::1])", parallel=True)
def numba_(data):
data_ = data[:, :2].astype(np.int8)
assert data_.shape[0] == data.shape[0]
depth = data[:, 2:].shape[1]
res = np.empty((data_[:, 0].max() 1, data_[:, 1].max() 1, depth))
for i in nb.prange(data_.shape[0]):
for j in range(depth):
res[data_[i, 0], data_[i, 1], j] = data[i, j 2]
return res
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/497785.html
