假設我有以下資料:
mask = [[0, 1, 1, 0, 1]] # 2D mask
ip_array = [[4, 5, 2]
[3, 2, 1]
[1, 8, 6]] # 2D array
ip_array我想在掩碼中有 0 的地方插入 0 列。所以輸出應該是這樣的:
[[0, 4, 5, 0, 2]
[0, 3, 2, 0, 1]
[0, 1, 8, 0, 6]]
我是 numpy 函式的新手,我正在尋找一種有效的方法來做到這一點。任何幫助表示贊賞!
uj5u.com熱心網友回復:
這是分兩步完成的一種方法:
(i) 創建一個由正確形狀的零組成的陣列(的第一維ip_array和第二維mask)
(ii) 使用mask跨第二維(作為布爾掩碼)并將 的值分配給ip_array零陣列。
out = np.zeros((ip_array.shape[0], mask.shape[1])).astype(int)
out[..., mask[0].astype(bool)] = ip_array
print(out)
輸出:
[[0 4 5 0 2]
[0 3 2 0 1]
[0 1 8 0 6]]
uj5u.com熱心網友回復:
這是另一種在輸入中使用帶有cumsum掩碼和額外 0 列的切片的方法。每當添加零時,cumsum 掩碼將具有ip_array 1 和 0 的索引。連接陣列有一個額外的初始零列,因此使用 0 進行索引會產生一列零。
m = (mask.cumsum()*mask)[0]
# array([0, 1, 2, 0, 3])
np.c_[np.zeros(ip_array.shape[0]), ip_array][:,m].astype(int)
# array([[0, 4, 5, 0, 2],
# [0, 3, 2, 0, 1],
# [0, 1, 8, 0, 6]])
uj5u.com熱心網友回復:
帶有引數和其他方法的解決方案,而不是綠色檢查。所以比較好理解。只是最后一行對操作很重要。
import numpy
import random
n1 = 5
n2 = 5
r = 0.7
random.seed(1)
a = numpy.array([[0 if random.random() > r else 1 for _ in range(n1)]])
n3 = numpy.count_nonzero(a)
b = numpy.array([[random.randint(1,9) for _ in range(n3)] for _ in range(n2)])
c = numpy.zeros((n2, n1))
c[:, numpy.where(a)[1]] = b[:]
結果:
a = array([[1, 0, 0, 1, 1]])
b = array([[8, 8, 7],
[4, 2, 8],
[1, 7, 7],
[1, 8, 5],
[4, 2, 6]])
c = array([[8., 0., 0., 8., 7.],
[4., 0., 0., 2., 8.],
[1., 0., 0., 7., 7.],
[1., 0., 0., 8., 5.],
[4., 0., 0., 2., 6.]])
在這里,您的時間處理取決于 n 值:

使用此代碼:
import numpy
import random
import time
import matplotlib.pyplot as plt
n1 = 5
n2 = 5
r = 0.7
def main(n1, n2):
print()
print(f"{n1 = }")
print(f"{n2 = }")
random.seed(1)
a = numpy.array([[0 if random.random() > r else 1 for _ in range(n1)]])
n3 = numpy.count_nonzero(a)
b = numpy.array([[random.randint(1,9) for _ in range(n3)] for _ in range(n2)])
t0 = time.time()
c = numpy.zeros((n2, n1))
c[:, numpy.where(a)[1]] = b[:]
t = time.time() - t0
print(f"{t = }")
return t
t1 = [main(10**i, 10) for i in range(1, 8)]
t2 = [main(10, 10**i) for i in range(1, 8)]
plt.plot(t1, label="n1 time process evolution")
plt.plot(t2, label="n2 time process evolution")
plt.xlabel("n-values (log)")
plt.ylabel("Time processing (s)")
plt.title("Insert columns into a numpy array based on mask")
plt.legend()
plt.show()
uj5u.com熱心網友回復:
mask = np.array([0, 1, 1, 0, 1])
#extract indices of zeros
mask_pos = (list(np.where(mask == 0)[0]))
ip_array =np.array([[4, 5, 2],
[3, 2, 1],
[1, 8, 6]])
#insert 0 at respextive mask position
for i in mask_pos:
ip_array = np.insert(ip_array,i,0,axis=1)
print(ip_array)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410489.html
標籤:
上一篇:RAM在計算上爆炸
