Giả sử bạn đang tìm kiếm để đặt tất cả các yếu tố cho mỗi hàng cho đến khi các yếu tố tiêu cực cuối cùng được thiết lập để không (theo sản lượng dự kiến niêm yết trong câu hỏi cho một trường hợp mẫu), hai cách tiếp cận có thể được gợi ý ở đây.
Approach # 1
một này được dựa trên np.cumsum
để tạo ra một mặt nạ của các yếu tố được thiết lập để số không như liệt kê bên cạnh -
# Get boolean mask with TRUEs for each row starting at the first element and
# ending at the last negative element
mask = (np.cumsum(A2[:,::-1]<0,1)>0)[:,::-1]
# Use mask to set all such al TRUEs to zeros as per the expected output in OP
A2[mask] = 0
mẫu chạy -
In [280]: A2 = np.random.randint(-4,10,(6,7)) # Random input 2D array
In [281]: A2
Out[281]:
array([[-2, 9, 8, -3, 2, 0, 5],
[-1, 9, 5, 1, -3, -3, -2],
[ 3, -3, 3, 5, 5, 2, 9],
[ 4, 6, -1, 6, 1, 2, 2],
[ 4, 4, 6, -3, 7, -3, -3],
[ 0, 2, -2, -3, 9, 4, 3]])
In [282]: A2[(np.cumsum(A2[:,::-1]<0,1)>0)[:,::-1]] = 0 # Use mask to set zeros
In [283]: A2
Out[283]:
array([[0, 0, 0, 0, 2, 0, 5],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 3, 5, 5, 2, 9],
[0, 0, 0, 6, 1, 2, 2],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 9, 4, 3]])
Phương pháp tiếp cận # 2
Điều này bắt đầu với ý tưởng tìm các chỉ số phần tử âm cuối cùng từ @tom10's answer
và phát triển thành phương pháp tìm kiếm mặt nạ bằng cách sử dụng broadcasting
để cho chúng tôi kết quả mong muốn, tương tự như approach #1
.
# Find last negative index for each row
last_idx = A2.shape[1] - 1 - np.argmax(A2[:,::-1]<0, axis=1)
# Find the invalid indices (rows with no negative indices)
invalid_idx = A2[np.arange(A2.shape[0]),last_idx]>=0
# Set the indices for invalid ones to "-1"
last_idx[invalid_idx] = -1
# Boolean mask with each row starting with TRUE as the first element
# and ending at the last negative element
mask = np.arange(A2.shape[1]) < (last_idx[:,None] + 1)
# Set masked elements to zeros, for the desired output
A2[mask] = 0
kiểm tra Runtime -
Chức năng defintions:
def broadcasting_based(A2):
last_idx = A2.shape[1] - 1 - np.argmax(A2[:,::-1]<0, axis=1)
last_idx[A2[np.arange(A2.shape[0]),last_idx]>=0] = -1
A2[np.arange(A2.shape[1]) < (last_idx[:,None] + 1)] = 0
return A2
def cumsum_based(A2):
A2[(np.cumsum(A2[:,::-1]<0,1)>0)[:,::-1]] = 0
return A2
Runtimes:
In [379]: A2 = np.random.randint(-4,10,(100000,100))
...: A2c = A2.copy()
...:
In [380]: %timeit broadcasting_based(A2)
10 loops, best of 3: 106 ms per loop
In [381]: %timeit cumsum_based(A2c)
1 loops, best of 3: 167 ms per loop
kiểm chứng kết quả -
In [384]: A2 = np.random.randint(-4,10,(100000,100))
...: A2c = A2.copy()
...:
In [385]: np.array_equal(broadcasting_based(A2),cumsum_based(A2c))
Out[385]: True
Bạn có nghĩa là bạn muốn làm điều tương tự trên mỗi hàng của mảng 2D? – csunday95
có chính xác ... mỗi hàng –
Bạn có phải xử lý trường hợp có số âm sau một số dương không? ví dụ. [-3, -4, -5,3,4, -7,8] => [0,0,0,3,4, -7,8] – csunday95